botmux 3.1.1 → 3.2.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 (190) hide show
  1. package/dist/adapters/backend/sandbox.d.ts +23 -0
  2. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  3. package/dist/adapters/backend/sandbox.js +68 -1
  4. package/dist/adapters/backend/sandbox.js.map +1 -1
  5. package/dist/adapters/cli/read-isolation.d.ts +1 -1
  6. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  7. package/dist/adapters/cli/read-isolation.js +15 -7
  8. package/dist/adapters/cli/read-isolation.js.map +1 -1
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +117 -25
  11. package/dist/cli.js.map +1 -1
  12. package/dist/core/command-handler.d.ts.map +1 -1
  13. package/dist/core/command-handler.js +11 -4
  14. package/dist/core/command-handler.js.map +1 -1
  15. package/dist/core/dashboard-ipc-server.d.ts +1 -0
  16. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  17. package/dist/core/dashboard-ipc-server.js +132 -0
  18. package/dist/core/dashboard-ipc-server.js.map +1 -1
  19. package/dist/core/maintenance.d.ts +23 -1
  20. package/dist/core/maintenance.d.ts.map +1 -1
  21. package/dist/core/maintenance.js +63 -25
  22. package/dist/core/maintenance.js.map +1 -1
  23. package/dist/core/plugins/cli-generation.d.ts.map +1 -1
  24. package/dist/core/plugins/cli-generation.js +7 -0
  25. package/dist/core/plugins/cli-generation.js.map +1 -1
  26. package/dist/core/plugins/convention-scanner.d.ts +3 -3
  27. package/dist/core/plugins/convention-scanner.d.ts.map +1 -1
  28. package/dist/core/plugins/convention-scanner.js.map +1 -1
  29. package/dist/core/plugins/install.d.ts.map +1 -1
  30. package/dist/core/plugins/install.js +84 -26
  31. package/dist/core/plugins/install.js.map +1 -1
  32. package/dist/core/plugins/mcp/environment.d.ts +12 -0
  33. package/dist/core/plugins/mcp/environment.d.ts.map +1 -0
  34. package/dist/core/plugins/mcp/environment.js +17 -0
  35. package/dist/core/plugins/mcp/environment.js.map +1 -0
  36. package/dist/core/plugins/mcp/gateway-installer.d.ts.map +1 -1
  37. package/dist/core/plugins/mcp/gateway-installer.js +9 -3
  38. package/dist/core/plugins/mcp/gateway-installer.js.map +1 -1
  39. package/dist/core/plugins/mcp/gateway.d.ts +13 -1
  40. package/dist/core/plugins/mcp/gateway.d.ts.map +1 -1
  41. package/dist/core/plugins/mcp/gateway.js +143 -23
  42. package/dist/core/plugins/mcp/gateway.js.map +1 -1
  43. package/dist/core/plugins/mcp/host.d.ts +18 -0
  44. package/dist/core/plugins/mcp/host.d.ts.map +1 -0
  45. package/dist/core/plugins/mcp/host.js +126 -0
  46. package/dist/core/plugins/mcp/host.js.map +1 -0
  47. package/dist/core/plugins/mcp/private-store.d.ts +15 -0
  48. package/dist/core/plugins/mcp/private-store.d.ts.map +1 -0
  49. package/dist/core/plugins/mcp/private-store.js +162 -0
  50. package/dist/core/plugins/mcp/private-store.js.map +1 -0
  51. package/dist/core/plugins/mcp/session-runtime.d.ts +25 -0
  52. package/dist/core/plugins/mcp/session-runtime.d.ts.map +1 -0
  53. package/dist/core/plugins/mcp/session-runtime.js +76 -0
  54. package/dist/core/plugins/mcp/session-runtime.js.map +1 -0
  55. package/dist/core/plugins/mcp/socket-auth.d.ts +9 -0
  56. package/dist/core/plugins/mcp/socket-auth.d.ts.map +1 -0
  57. package/dist/core/plugins/mcp/socket-auth.js +94 -0
  58. package/dist/core/plugins/mcp/socket-auth.js.map +1 -0
  59. package/dist/core/plugins/paths.d.ts +3 -0
  60. package/dist/core/plugins/paths.d.ts.map +1 -1
  61. package/dist/core/plugins/paths.js +9 -0
  62. package/dist/core/plugins/paths.js.map +1 -1
  63. package/dist/core/plugins/pm2.d.ts.map +1 -1
  64. package/dist/core/plugins/pm2.js +3 -1
  65. package/dist/core/plugins/pm2.js.map +1 -1
  66. package/dist/core/plugins/runtime.d.ts +2 -0
  67. package/dist/core/plugins/runtime.d.ts.map +1 -1
  68. package/dist/core/plugins/runtime.js.map +1 -1
  69. package/dist/core/plugins/service-manager.d.ts +22 -0
  70. package/dist/core/plugins/service-manager.d.ts.map +1 -1
  71. package/dist/core/plugins/service-manager.js +189 -52
  72. package/dist/core/plugins/service-manager.js.map +1 -1
  73. package/dist/core/plugins/types.d.ts +15 -1
  74. package/dist/core/plugins/types.d.ts.map +1 -1
  75. package/dist/core/restart-report.d.ts +1 -1
  76. package/dist/core/restart-report.d.ts.map +1 -1
  77. package/dist/core/restart-report.js +5 -3
  78. package/dist/core/restart-report.js.map +1 -1
  79. package/dist/core/scheduler.d.ts +47 -0
  80. package/dist/core/scheduler.d.ts.map +1 -1
  81. package/dist/core/scheduler.js +117 -0
  82. package/dist/core/scheduler.js.map +1 -1
  83. package/dist/core/session-manager.d.ts +7 -0
  84. package/dist/core/session-manager.d.ts.map +1 -1
  85. package/dist/core/session-manager.js +130 -33
  86. package/dist/core/session-manager.js.map +1 -1
  87. package/dist/core/silent-schedule-turns.d.ts +5 -0
  88. package/dist/core/silent-schedule-turns.d.ts.map +1 -0
  89. package/dist/core/silent-schedule-turns.js +47 -0
  90. package/dist/core/silent-schedule-turns.js.map +1 -0
  91. package/dist/core/types.d.ts +6 -0
  92. package/dist/core/types.d.ts.map +1 -1
  93. package/dist/core/types.js.map +1 -1
  94. package/dist/core/update-check.d.ts +16 -0
  95. package/dist/core/update-check.d.ts.map +1 -1
  96. package/dist/core/update-check.js +52 -0
  97. package/dist/core/update-check.js.map +1 -1
  98. package/dist/core/worker-pool.d.ts.map +1 -1
  99. package/dist/core/worker-pool.js +30 -23
  100. package/dist/core/worker-pool.js.map +1 -1
  101. package/dist/dashboard/schedule-card-model.d.ts +3 -0
  102. package/dist/dashboard/schedule-card-model.d.ts.map +1 -1
  103. package/dist/dashboard/schedule-card-model.js +5 -0
  104. package/dist/dashboard/schedule-card-model.js.map +1 -1
  105. package/dist/dashboard/web/app.d.ts.map +1 -1
  106. package/dist/dashboard/web/app.js +295 -6
  107. package/dist/dashboard/web/app.js.map +1 -1
  108. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  109. package/dist/dashboard/web/i18n.js +92 -0
  110. package/dist/dashboard/web/i18n.js.map +1 -1
  111. package/dist/dashboard/web/plugin-page.d.ts.map +1 -1
  112. package/dist/dashboard/web/plugin-page.js +1 -3
  113. package/dist/dashboard/web/plugin-page.js.map +1 -1
  114. package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
  115. package/dist/dashboard/web/schedules-page.js +111 -4
  116. package/dist/dashboard/web/schedules-page.js.map +1 -1
  117. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  118. package/dist/dashboard/web/settings-page.js +5 -1
  119. package/dist/dashboard/web/settings-page.js.map +1 -1
  120. package/dist/dashboard/web/update-action.d.ts +16 -0
  121. package/dist/dashboard/web/update-action.d.ts.map +1 -0
  122. package/dist/dashboard/web/update-action.js +64 -0
  123. package/dist/dashboard/web/update-action.js.map +1 -0
  124. package/dist/dashboard-web/app.js +1 -1
  125. package/dist/dashboard-web/chunks/{bot-defaults-page-KLDCZNLP.js → bot-defaults-page-4PM4T6QQ.js} +1 -1
  126. package/dist/dashboard-web/chunks/{chunk-FMJNOATE.js → chunk-3PMN55Z6.js} +1 -1
  127. package/dist/dashboard-web/chunks/{chunk-MLNI5BKE.js → chunk-AIDN2WZB.js} +1 -1
  128. package/dist/dashboard-web/chunks/{chunk-EZAW2EPM.js → chunk-IKCZ677K.js} +1 -1
  129. package/dist/dashboard-web/chunks/{chunk-KEAOTUL3.js → chunk-RXVA6XW3.js} +7 -7
  130. package/dist/dashboard-web/chunks/{connectors-page-O32LFAL5.js → connectors-page-2MKF4YTN.js} +1 -1
  131. package/dist/dashboard-web/chunks/{groups-page-PSAFIZ6M.js → groups-page-TAU2UIVS.js} +1 -1
  132. package/dist/dashboard-web/chunks/{insights-page-V23LLATX.js → insights-page-PJ2XVM6T.js} +1 -1
  133. package/dist/dashboard-web/chunks/{monitor-room-7X5AKYOF.js → monitor-room-D6445HJO.js} +1 -1
  134. package/dist/dashboard-web/chunks/{monitoring-page-CBA3CQYL.js → monitoring-page-GUHMCKSO.js} +1 -1
  135. package/dist/dashboard-web/chunks/{office-page-RL6QSEM7.js → office-page-6K6U2MS5.js} +1 -1
  136. package/dist/dashboard-web/chunks/{overview-page-XQIPO6KH.js → overview-page-USDYU7U5.js} +1 -1
  137. package/dist/dashboard-web/chunks/plugin-page-JXC5F5YV.js +1 -0
  138. package/dist/dashboard-web/chunks/{roles-page-ACIWV7QS.js → roles-page-O4OUA7ZH.js} +1 -1
  139. package/dist/dashboard-web/chunks/schedules-page-LNIBXJSZ.js +1 -0
  140. package/dist/dashboard-web/chunks/{sessions-page-2WDWHSP4.js → sessions-page-B6U6TCFF.js} +1 -1
  141. package/dist/dashboard-web/chunks/{settings-page-6VX4OUGG.js → settings-page-PXLRFF7I.js} +2 -2
  142. package/dist/dashboard-web/chunks/{skills-page-WXE3UYLT.js → skills-page-M5KYNXBA.js} +1 -1
  143. package/dist/dashboard-web/chunks/{team-federation-page-PYTF4FLM.js → team-federation-page-GT7UFQMN.js} +1 -1
  144. package/dist/dashboard-web/chunks/{v3-page-G6CD6O3I.js → v3-page-UYZIRJ2C.js} +1 -1
  145. package/dist/dashboard-web/chunks/{whiteboards-page-6SG33GP4.js → whiteboards-page-WAR77DQE.js} +1 -1
  146. package/dist/dashboard-web/style.css +697 -0
  147. package/dist/dashboard.js +404 -29
  148. package/dist/dashboard.js.map +1 -1
  149. package/dist/i18n/en.d.ts.map +1 -1
  150. package/dist/i18n/en.js +4 -0
  151. package/dist/i18n/en.js.map +1 -1
  152. package/dist/i18n/zh.d.ts.map +1 -1
  153. package/dist/i18n/zh.js +4 -0
  154. package/dist/i18n/zh.js.map +1 -1
  155. package/dist/im/lark/schedules-card.d.ts.map +1 -1
  156. package/dist/im/lark/schedules-card.js +2 -0
  157. package/dist/im/lark/schedules-card.js.map +1 -1
  158. package/dist/services/plugin-registry-store.d.ts.map +1 -1
  159. package/dist/services/plugin-registry-store.js +100 -18
  160. package/dist/services/plugin-registry-store.js.map +1 -1
  161. package/dist/services/restart-intent-store.d.ts +17 -2
  162. package/dist/services/restart-intent-store.d.ts.map +1 -1
  163. package/dist/services/restart-intent-store.js +110 -0
  164. package/dist/services/restart-intent-store.js.map +1 -1
  165. package/dist/services/schedule-store.d.ts +3 -1
  166. package/dist/services/schedule-store.d.ts.map +1 -1
  167. package/dist/services/schedule-store.js +5 -0
  168. package/dist/services/schedule-store.js.map +1 -1
  169. package/dist/skills/definitions.d.ts.map +1 -1
  170. package/dist/skills/definitions.js +3 -2
  171. package/dist/skills/definitions.js.map +1 -1
  172. package/dist/types.d.ts +16 -0
  173. package/dist/types.d.ts.map +1 -1
  174. package/dist/utils/child-env.d.ts +1 -1
  175. package/dist/utils/child-env.d.ts.map +1 -1
  176. package/dist/utils/child-env.js +5 -0
  177. package/dist/utils/child-env.js.map +1 -1
  178. package/dist/utils/global-install.d.ts +2 -0
  179. package/dist/utils/global-install.d.ts.map +1 -1
  180. package/dist/utils/global-install.js +14 -0
  181. package/dist/utils/global-install.js.map +1 -1
  182. package/dist/worker.js +125 -17
  183. package/dist/worker.js.map +1 -1
  184. package/dist/workflows/hostExecutors/botmux-schedule.d.ts +3 -0
  185. package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +1 -1
  186. package/dist/workflows/hostExecutors/botmux-schedule.js +9 -0
  187. package/dist/workflows/hostExecutors/botmux-schedule.js.map +1 -1
  188. package/package.json +1 -1
  189. package/dist/dashboard-web/chunks/plugin-page-7FW2LPJH.js +0 -1
  190. package/dist/dashboard-web/chunks/schedules-page-KJDUKOJV.js +0 -1
@@ -0,0 +1,126 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ import { chmodSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { createServer } from 'node:net';
6
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
7
+ import { PluginMcpGateway } from './gateway.js';
8
+ import { acceptMcpGatewayHandshake, mcpGatewayAuthTokenPath } from './socket-auth.js';
9
+ function escapeForRegex(value) {
10
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
11
+ }
12
+ /** Seatbelt deny for every Gateway socket directory owned by this OS user. */
13
+ export function sessionMcpGatewayPathRegex(socketRoot, uid = process.getuid?.() ?? 0) {
14
+ const root = socketRoot.replace(/\/+$/, '');
15
+ return `^${escapeForRegex(root)}/bmcp-${uid}-[^/]+(?:/|$)`;
16
+ }
17
+ function gatewaySocketDir(sessionId, dataDir) {
18
+ const uid = process.getuid?.() ?? 0;
19
+ const sessionKey = createHash('sha256')
20
+ .update(dataDir)
21
+ .update('\0')
22
+ .update(sessionId)
23
+ .digest('hex')
24
+ .slice(0, 8);
25
+ // mkdtemp is atomic, avoids a predictable shared parent under /tmp, and
26
+ // keeps the resulting Unix socket below macOS's short sun_path limit.
27
+ return mkdtempSync(join(tmpdir(), `bmcp-${uid}-${sessionKey}-`));
28
+ }
29
+ /**
30
+ * Serve a session's credential-bearing Gateway in the trusted worker process.
31
+ * The CLI receives only a Unix socket capability and never reads the runtime
32
+ * descriptor snapshot or plugin credentials itself.
33
+ */
34
+ export async function startSessionMcpGatewayHost(opts) {
35
+ const socketDir = gatewaySocketDir(opts.sessionId, opts.dataDir);
36
+ const socketPath = join(socketDir, 'g.sock');
37
+ const authToken = randomBytes(32).toString('base64url');
38
+ chmodSync(socketDir, 0o700);
39
+ writeFileSync(mcpGatewayAuthTokenPath(socketPath), `${authToken}\n`, { mode: 0o600, flag: 'wx' });
40
+ const sockets = new Set();
41
+ const connectionClosers = new Set();
42
+ let closing;
43
+ const reportError = (error) => {
44
+ opts.onError?.(error instanceof Error ? error : new Error(String(error)));
45
+ };
46
+ const server = createServer((socket) => {
47
+ sockets.add(socket);
48
+ socket.setNoDelay(true);
49
+ socket.once('close', () => {
50
+ sockets.delete(socket);
51
+ });
52
+ void (async () => {
53
+ if (!await acceptMcpGatewayHandshake(socket, authToken))
54
+ return;
55
+ const gateway = new PluginMcpGateway(undefined, {
56
+ ...process.env,
57
+ SESSION_DATA_DIR: opts.dataDir,
58
+ BOTMUX_SESSION_ID: opts.sessionId,
59
+ });
60
+ let gatewayClose;
61
+ const closeGateway = () => {
62
+ gatewayClose ??= gateway.close()
63
+ .catch(reportError)
64
+ .finally(() => connectionClosers.delete(closeGateway));
65
+ return gatewayClose;
66
+ };
67
+ connectionClosers.add(closeGateway);
68
+ socket.once('close', () => { void closeGateway(); });
69
+ await gateway.connect(new StdioServerTransport(socket, socket));
70
+ socket.resume();
71
+ })().catch((error) => {
72
+ reportError(error);
73
+ socket.destroy();
74
+ });
75
+ });
76
+ await new Promise((resolve, reject) => {
77
+ const onInitialError = (error) => {
78
+ server.off('listening', onListening);
79
+ reject(error);
80
+ };
81
+ const onListening = () => {
82
+ server.off('error', onInitialError);
83
+ resolve();
84
+ };
85
+ server.once('error', onInitialError);
86
+ server.once('listening', onListening);
87
+ server.listen(socketPath);
88
+ }).catch((error) => {
89
+ rmSync(socketDir, { recursive: true, force: true });
90
+ throw error;
91
+ });
92
+ server.on('error', reportError);
93
+ try {
94
+ chmodSync(socketPath, 0o600);
95
+ }
96
+ catch (error) {
97
+ server.close();
98
+ rmSync(socketDir, { recursive: true, force: true });
99
+ throw error;
100
+ }
101
+ return {
102
+ socketPath,
103
+ socketDir,
104
+ close() {
105
+ closing ??= (async () => {
106
+ for (const socket of sockets)
107
+ socket.destroy();
108
+ // Revoke the filesystem capability before the first await. Worker
109
+ // signal handlers call process.exit(), so async-only cleanup would
110
+ // otherwise leave a stale socket directory behind.
111
+ rmSync(socketDir, { recursive: true, force: true });
112
+ const serverClosed = new Promise((resolve) => {
113
+ if (!server.listening) {
114
+ resolve();
115
+ return;
116
+ }
117
+ server.close(() => resolve());
118
+ });
119
+ await Promise.allSettled([...connectionClosers].map(close => close()));
120
+ await serverClosed;
121
+ })();
122
+ return closing;
123
+ },
124
+ };
125
+ }
126
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../../../src/core/plugins/mcp/host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { PluginMcpContribution, PluginMcpServer } from '../types.js';
2
+ export declare const PLUGIN_MCP_PRIVATE_REF = "private/mcp.json";
3
+ export interface PluginMcpPrivateSnapshot {
4
+ existed: boolean;
5
+ content?: Buffer;
6
+ }
7
+ export declare function isPluginMcpServer(value: unknown): value is PluginMcpServer;
8
+ export declare function isPluginMcpContribution(value: unknown): value is PluginMcpContribution;
9
+ export declare function publicPluginMcpContribution(server: PluginMcpServer): PluginMcpContribution;
10
+ export declare function capturePluginMcpPrivateSnapshot(pluginId: string): PluginMcpPrivateSnapshot;
11
+ export declare function restorePluginMcpPrivateSnapshot(pluginId: string, snapshot: PluginMcpPrivateSnapshot): void;
12
+ export declare function writePluginMcpDescriptor(pluginId: string, server: PluginMcpServer): PluginMcpContribution;
13
+ export declare function removePluginMcpDescriptor(pluginId: string): void;
14
+ export declare function readPluginMcpDescriptor(pluginId: string, contribution: PluginMcpContribution): PluginMcpServer;
15
+ //# sourceMappingURL=private-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private-store.d.ts","sourceRoot":"","sources":["../../../../src/core/plugins/mcp/private-store.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,qBAAqB,EACrB,eAAe,EAChB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AAQzD,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AASD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAqB1E;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,qBAAqB,CAOtF;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,eAAe,GAAG,qBAAqB,CAM1F;AA6BD,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,GAAG,wBAAwB,CAK1F;AAED,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,wBAAwB,GACjC,IAAI,CAcN;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,eAAe,GACtB,qBAAqB,CAavB;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAShE;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,qBAAqB,GAClC,eAAe,CA4BjB"}
@@ -0,0 +1,162 @@
1
+ import { chmodSync, closeSync, constants, existsSync, fstatSync, lstatSync, mkdirSync, openSync, readFileSync, readdirSync, rmSync, } from 'node:fs';
2
+ import { atomicWriteFileSync } from '../../../utils/atomic-write.js';
3
+ import { assertValidPluginId } from '../ids.js';
4
+ import { pluginHome, pluginMcpPrivatePath, pluginPrivateDir, } from '../paths.js';
5
+ export const PLUGIN_MCP_PRIVATE_REF = 'private/mcp.json';
6
+ function isStringRecord(value) {
7
+ return !!value
8
+ && typeof value === 'object'
9
+ && !Array.isArray(value)
10
+ && Object.values(value).every(item => typeof item === 'string');
11
+ }
12
+ export function isPluginMcpServer(value) {
13
+ if (!value || typeof value !== 'object' || Array.isArray(value))
14
+ return false;
15
+ const server = value;
16
+ if (typeof server.name !== 'string' || !server.name)
17
+ return false;
18
+ if (server.transport === 'stdio') {
19
+ return Array.isArray(server.command)
20
+ && server.command.length > 0
21
+ && server.command.every(part => typeof part === 'string' && part.length > 0)
22
+ && (server.env === undefined || isStringRecord(server.env));
23
+ }
24
+ if (server.transport === 'streamable-http') {
25
+ if (typeof server.url !== 'string' || !server.url)
26
+ return false;
27
+ try {
28
+ const protocol = new URL(server.url).protocol;
29
+ if (protocol !== 'http:' && protocol !== 'https:')
30
+ return false;
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ return server.headers === undefined || isStringRecord(server.headers);
36
+ }
37
+ return false;
38
+ }
39
+ export function isPluginMcpContribution(value) {
40
+ if (!value || typeof value !== 'object' || Array.isArray(value))
41
+ return false;
42
+ const entry = value;
43
+ return typeof entry.name === 'string'
44
+ && !!entry.name
45
+ && (entry.transport === 'stdio' || entry.transport === 'streamable-http')
46
+ && entry.privateRef === PLUGIN_MCP_PRIVATE_REF;
47
+ }
48
+ export function publicPluginMcpContribution(server) {
49
+ return {
50
+ name: server.name,
51
+ transport: server.transport,
52
+ privateRef: PLUGIN_MCP_PRIVATE_REF,
53
+ };
54
+ }
55
+ function assertPrivateStorageLayout(pluginId, create) {
56
+ const id = assertValidPluginId(pluginId);
57
+ const home = pluginHome(id);
58
+ if (existsSync(home)) {
59
+ const stat = lstatSync(home);
60
+ if (!stat.isDirectory() || stat.isSymbolicLink())
61
+ throw new Error(`unsafe_plugin_home:${id}`);
62
+ }
63
+ else if (create) {
64
+ mkdirSync(home, { recursive: true, mode: 0o700 });
65
+ }
66
+ const dir = pluginPrivateDir(id);
67
+ if (existsSync(dir)) {
68
+ const stat = lstatSync(dir);
69
+ if (!stat.isDirectory() || stat.isSymbolicLink())
70
+ throw new Error(`unsafe_plugin_private_dir:${id}`);
71
+ chmodSync(dir, 0o700);
72
+ }
73
+ else if (create) {
74
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
75
+ chmodSync(dir, 0o700);
76
+ }
77
+ const file = pluginMcpPrivatePath(id);
78
+ if (existsSync(file)) {
79
+ const stat = lstatSync(file);
80
+ if (!stat.isFile() || stat.isSymbolicLink())
81
+ throw new Error(`unsafe_plugin_mcp_private_file:${id}`);
82
+ }
83
+ }
84
+ export function capturePluginMcpPrivateSnapshot(pluginId) {
85
+ assertPrivateStorageLayout(pluginId, false);
86
+ const file = pluginMcpPrivatePath(pluginId);
87
+ if (!existsSync(file))
88
+ return { existed: false };
89
+ return { existed: true, content: readFileSync(file) };
90
+ }
91
+ export function restorePluginMcpPrivateSnapshot(pluginId, snapshot) {
92
+ const file = pluginMcpPrivatePath(pluginId);
93
+ if (snapshot.existed) {
94
+ assertPrivateStorageLayout(pluginId, true);
95
+ atomicWriteFileSync(file, snapshot.content ?? Buffer.alloc(0), { mode: 0o600 });
96
+ return;
97
+ }
98
+ rmSync(file, { force: true });
99
+ const dir = pluginPrivateDir(pluginId);
100
+ try {
101
+ if (readdirSync(dir).length === 0)
102
+ rmSync(dir, { recursive: true, force: true });
103
+ }
104
+ catch {
105
+ // The directory may not have existed before the attempted migration.
106
+ }
107
+ }
108
+ export function writePluginMcpDescriptor(pluginId, server) {
109
+ const id = assertValidPluginId(pluginId);
110
+ if (!isPluginMcpServer(server) || server.name !== id) {
111
+ throw new Error(`invalid_plugin_mcp_private_descriptor:${id}`);
112
+ }
113
+ assertPrivateStorageLayout(id, true);
114
+ const value = { schemaVersion: 1, pluginId: id, server };
115
+ atomicWriteFileSync(pluginMcpPrivatePath(id), `${JSON.stringify(value, null, 2)}\n`, { mode: 0o600 });
116
+ return publicPluginMcpContribution(server);
117
+ }
118
+ export function removePluginMcpDescriptor(pluginId) {
119
+ assertPrivateStorageLayout(pluginId, false);
120
+ rmSync(pluginMcpPrivatePath(pluginId), { force: true });
121
+ const dir = pluginPrivateDir(pluginId);
122
+ try {
123
+ if (readdirSync(dir).length === 0)
124
+ rmSync(dir, { recursive: true, force: true });
125
+ }
126
+ catch {
127
+ // No private directory is a valid state for a plugin without MCP.
128
+ }
129
+ }
130
+ export function readPluginMcpDescriptor(pluginId, contribution) {
131
+ const id = assertValidPluginId(pluginId);
132
+ if (!isPluginMcpContribution(contribution)) {
133
+ throw new Error(`invalid_plugin_mcp_private_ref:${id}`);
134
+ }
135
+ assertPrivateStorageLayout(id, false);
136
+ const file = pluginMcpPrivatePath(id);
137
+ let fd;
138
+ try {
139
+ fd = openSync(file, constants.O_RDONLY | constants.O_NOFOLLOW);
140
+ if (!fstatSync(fd).isFile())
141
+ throw new Error(`invalid_plugin_mcp_private_file:${id}`);
142
+ const parsed = JSON.parse(readFileSync(fd, 'utf8'));
143
+ if (parsed.schemaVersion !== 1
144
+ || parsed.pluginId !== id
145
+ || !isPluginMcpServer(parsed.server)
146
+ || parsed.server.name !== contribution.name
147
+ || parsed.server.transport !== contribution.transport)
148
+ throw new Error(`invalid_plugin_mcp_private_descriptor:${id}`);
149
+ return parsed.server;
150
+ }
151
+ catch (error) {
152
+ if (error.code === 'ENOENT') {
153
+ throw new Error(`plugin_mcp_private_descriptor_missing:${id}`);
154
+ }
155
+ throw error;
156
+ }
157
+ finally {
158
+ if (fd !== undefined)
159
+ closeSync(fd);
160
+ }
161
+ }
162
+ //# sourceMappingURL=private-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private-store.js","sourceRoot":"","sources":["../../../../src/core/plugins/mcp/private-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { PluginMcpServer } from '../types.js';
2
+ export interface SessionMcpRuntimeEntry {
3
+ pluginId: string;
4
+ pluginDir: string;
5
+ server: PluginMcpServer;
6
+ }
7
+ export interface SessionMcpRuntimeManifest {
8
+ schemaVersion: 1;
9
+ sessionId: string;
10
+ pluginIds: string[];
11
+ generatedAt: string;
12
+ entries: SessionMcpRuntimeEntry[];
13
+ }
14
+ export declare function sessionMcpRuntimeManifestPath(sessionId: string, dataDir?: string): string;
15
+ export declare function readSessionMcpRuntimeManifest(sessionId: string, dataDir?: string): SessionMcpRuntimeManifest | null;
16
+ export declare function refreshSessionMcpRuntimeManifest(opts: {
17
+ sessionId: string;
18
+ pluginIds: readonly string[];
19
+ dataDir?: string;
20
+ now?: () => string;
21
+ }): SessionMcpRuntimeManifest;
22
+ /** Credential-bearing paths consumed only by the trusted Gateway host. They
23
+ * must never become CLI sandbox read carve-outs. */
24
+ export declare function sessionMcpRuntimeHostOnlyPaths(manifest: SessionMcpRuntimeManifest, dataDir?: string): string[];
25
+ //# sourceMappingURL=session-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-runtime.d.ts","sourceRoot":"","sources":["../../../../src/core/plugins/mcp/session-runtime.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,CAAC,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,sBAAsB,EAAE,CAAC;CACnC;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,MAA+B,GACvC,MAAM,CAER;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,MAA+B,GACvC,yBAAyB,GAAG,IAAI,CA0BlC;AAED,wBAAgB,gCAAgC,CAAC,IAAI,EAAE;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,GAAG,yBAAyB,CAqB5B;AAED;oDACoD;AACpD,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,yBAAyB,EACnC,OAAO,GAAE,MAA+B,GACvC,MAAM,EAAE,CAQV"}
@@ -0,0 +1,76 @@
1
+ import { existsSync, mkdirSync, readFileSync } from 'node:fs';
2
+ import { dirname, isAbsolute, join } from 'node:path';
3
+ import { config } from '../../../config.js';
4
+ import { readPluginRegistry } from '../../../services/plugin-registry-store.js';
5
+ import { atomicWriteFileSync } from '../../../utils/atomic-write.js';
6
+ import { pluginMcpPrivatePath, pluginRuntimeDir } from '../paths.js';
7
+ import { sessionPluginManifestPath } from '../session-manifest.js';
8
+ import { isPluginMcpServer, readPluginMcpDescriptor } from './private-store.js';
9
+ export function sessionMcpRuntimeManifestPath(sessionId, dataDir = config.session.dataDir) {
10
+ return join(dirname(sessionPluginManifestPath(sessionId, dataDir)), 'plugin-mcp-runtime.json');
11
+ }
12
+ export function readSessionMcpRuntimeManifest(sessionId, dataDir = config.session.dataDir) {
13
+ const path = sessionMcpRuntimeManifestPath(sessionId, dataDir);
14
+ if (!existsSync(path))
15
+ return null;
16
+ try {
17
+ const parsed = JSON.parse(readFileSync(path, 'utf8'));
18
+ if (parsed.schemaVersion !== 1
19
+ || parsed.sessionId !== sessionId
20
+ || !Array.isArray(parsed.pluginIds)
21
+ || !parsed.pluginIds.every(id => typeof id === 'string')
22
+ || !Array.isArray(parsed.entries))
23
+ return null;
24
+ const enabled = new Set(parsed.pluginIds);
25
+ if (!parsed.entries.every((entry) => {
26
+ if (!entry || typeof entry !== 'object' || Array.isArray(entry))
27
+ return false;
28
+ const value = entry;
29
+ return typeof value.pluginId === 'string'
30
+ && enabled.has(value.pluginId)
31
+ && typeof value.pluginDir === 'string'
32
+ && isAbsolute(value.pluginDir)
33
+ && isPluginMcpServer(value.server);
34
+ }))
35
+ return null;
36
+ return parsed;
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ }
42
+ export function refreshSessionMcpRuntimeManifest(opts) {
43
+ const registry = readPluginRegistry();
44
+ const pluginIds = [...opts.pluginIds];
45
+ const entries = [];
46
+ for (const pluginId of pluginIds) {
47
+ const contribution = registry.plugins[pluginId]?.contributions?.mcp;
48
+ if (!contribution)
49
+ continue;
50
+ const server = readPluginMcpDescriptor(pluginId, contribution);
51
+ entries.push({ pluginId, pluginDir: pluginRuntimeDir(pluginId), server });
52
+ }
53
+ const manifest = {
54
+ schemaVersion: 1,
55
+ sessionId: opts.sessionId,
56
+ pluginIds,
57
+ generatedAt: opts.now ? opts.now() : new Date().toISOString(),
58
+ entries,
59
+ };
60
+ const path = sessionMcpRuntimeManifestPath(opts.sessionId, opts.dataDir);
61
+ mkdirSync(dirname(path), { recursive: true });
62
+ atomicWriteFileSync(path, `${JSON.stringify(manifest, null, 2)}\n`, { mode: 0o600 });
63
+ return manifest;
64
+ }
65
+ /** Credential-bearing paths consumed only by the trusted Gateway host. They
66
+ * must never become CLI sandbox read carve-outs. */
67
+ export function sessionMcpRuntimeHostOnlyPaths(manifest, dataDir = config.session.dataDir) {
68
+ return [...new Set([
69
+ sessionMcpRuntimeManifestPath(manifest.sessionId, dataDir),
70
+ ...manifest.entries.flatMap(entry => [
71
+ pluginMcpPrivatePath(entry.pluginId),
72
+ join(entry.pluginDir, 'mcp', 'index.json'),
73
+ ]),
74
+ ])];
75
+ }
76
+ //# sourceMappingURL=session-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-runtime.js","sourceRoot":"","sources":["../../../../src/core/plugins/mcp/session-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAgBhF,MAAM,UAAU,6BAA6B,CAC3C,SAAiB,EACjB,UAAkB,MAAM,CAAC,OAAO,CAAC,OAAO;IAExC,OAAO,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,yBAAyB,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,SAAiB,EACjB,UAAkB,MAAM,CAAC,OAAO,CAAC,OAAO;IAExC,MAAM,IAAI,GAAG,6BAA6B,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAuC,CAAC;QAC5F,IACE,MAAM,CAAC,aAAa,KAAK,CAAC;eACvB,MAAM,CAAC,SAAS,KAAK,SAAS;eAC9B,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;eAChC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC;eACrD,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAClC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC9E,MAAM,KAAK,GAAG,KAAwC,CAAC;YACvD,OAAO,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;mBACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;mBAC3B,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;mBACnC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;mBAC3B,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAChB,OAAO,MAAmC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,IAKhD;IACC,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,OAAO,GAA6B,EAAE,CAAC;IAC7C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC;QACpE,IAAI,CAAC,YAAY;YAAE,SAAS;QAC5B,MAAM,MAAM,GAAG,uBAAuB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,QAAQ,GAA8B;QAC1C,aAAa,EAAE,CAAC;QAChB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS;QACT,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC7D,OAAO;KACR,CAAC;IACF,MAAM,IAAI,GAAG,6BAA6B,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACzE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,mBAAmB,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;oDACoD;AACpD,MAAM,UAAU,8BAA8B,CAC5C,QAAmC,EACnC,UAAkB,MAAM,CAAC,OAAO,CAAC,OAAO;IAExC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC;YACjB,6BAA6B,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;YAC1D,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnC,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACpC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,YAAY,CAAC;aAC3C,CAAC;SACH,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Socket } from 'node:net';
2
+ export declare const MCP_GATEWAY_AUTH_FILENAME = "auth";
3
+ export declare function mcpGatewayAuthTokenPath(socketPath: string): string;
4
+ export declare function readMcpGatewayAuthToken(socketPath: string): string;
5
+ /** Authenticate a newly accepted worker-side socket before MCP sees any bytes. */
6
+ export declare function acceptMcpGatewayHandshake(socket: Socket, expectedToken: string): Promise<boolean>;
7
+ /** Authenticate the CLI-side relay before piping untrusted MCP stdio. */
8
+ export declare function sendMcpGatewayHandshake(socket: Socket, token: string): Promise<void>;
9
+ //# sourceMappingURL=socket-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-auth.d.ts","sourceRoot":"","sources":["../../../../src/core/plugins/mcp/socket-auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAUvC,eAAO,MAAM,yBAAyB,SAAS,CAAC;AAEhD,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAIlE;AAqDD,kFAAkF;AAClF,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBvG;AAED,yEAAyE;AACzE,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO1F"}
@@ -0,0 +1,94 @@
1
+ import { timingSafeEqual } from 'node:crypto';
2
+ import { readFileSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { MCP_GATEWAY_HANDSHAKE_ERROR, MCP_GATEWAY_HANDSHAKE_OK, MCP_GATEWAY_HANDSHAKE_PREFIX, } from './environment.js';
5
+ const MAX_HANDSHAKE_BYTES = 512;
6
+ const HANDSHAKE_TIMEOUT_MS = 2_000;
7
+ export const MCP_GATEWAY_AUTH_FILENAME = 'auth';
8
+ export function mcpGatewayAuthTokenPath(socketPath) {
9
+ return join(dirname(socketPath), MCP_GATEWAY_AUTH_FILENAME);
10
+ }
11
+ export function readMcpGatewayAuthToken(socketPath) {
12
+ const token = readFileSync(mcpGatewayAuthTokenPath(socketPath), 'utf8').trim();
13
+ if (!token)
14
+ throw new Error('Gateway authentication token is empty');
15
+ return token;
16
+ }
17
+ function readSocketLine(socket) {
18
+ return new Promise((resolve, reject) => {
19
+ let buffer = Buffer.alloc(0);
20
+ let timer;
21
+ const cleanup = () => {
22
+ if (timer)
23
+ clearTimeout(timer);
24
+ socket.off('data', onData);
25
+ socket.off('error', onError);
26
+ socket.off('close', onClose);
27
+ };
28
+ const finish = (error, line) => {
29
+ cleanup();
30
+ if (error)
31
+ reject(error);
32
+ else
33
+ resolve(line ?? '');
34
+ };
35
+ const onError = (error) => finish(error);
36
+ const onClose = () => finish(new Error('Gateway connection closed during authentication'));
37
+ const onData = (chunk) => {
38
+ const bytes = typeof chunk === 'string' ? Buffer.from(chunk) : chunk;
39
+ buffer = Buffer.concat([buffer, bytes]);
40
+ if (buffer.length > MAX_HANDSHAKE_BYTES) {
41
+ finish(new Error('Gateway authentication frame is too large'));
42
+ return;
43
+ }
44
+ const newline = buffer.indexOf(0x0a);
45
+ if (newline < 0)
46
+ return;
47
+ const remainder = buffer.subarray(newline + 1);
48
+ socket.pause();
49
+ if (remainder.length > 0)
50
+ socket.unshift(remainder);
51
+ finish(undefined, buffer.subarray(0, newline).toString('utf8').replace(/\r$/, ''));
52
+ };
53
+ timer = setTimeout(() => finish(new Error('Gateway authentication timed out')), HANDSHAKE_TIMEOUT_MS);
54
+ timer.unref?.();
55
+ socket.on('data', onData);
56
+ socket.once('error', onError);
57
+ socket.once('close', onClose);
58
+ });
59
+ }
60
+ function tokenMatches(presented, expected) {
61
+ const presentedBytes = Buffer.from(presented);
62
+ const expectedBytes = Buffer.from(expected);
63
+ return presentedBytes.length === expectedBytes.length
64
+ && timingSafeEqual(presentedBytes, expectedBytes);
65
+ }
66
+ /** Authenticate a newly accepted worker-side socket before MCP sees any bytes. */
67
+ export async function acceptMcpGatewayHandshake(socket, expectedToken) {
68
+ try {
69
+ const line = await readSocketLine(socket);
70
+ const presentedToken = line.startsWith(MCP_GATEWAY_HANDSHAKE_PREFIX)
71
+ ? line.slice(MCP_GATEWAY_HANDSHAKE_PREFIX.length)
72
+ : '';
73
+ if (!tokenMatches(presentedToken, expectedToken)) {
74
+ socket.end(`${MCP_GATEWAY_HANDSHAKE_ERROR}\n`);
75
+ return false;
76
+ }
77
+ socket.write(`${MCP_GATEWAY_HANDSHAKE_OK}\n`);
78
+ return true;
79
+ }
80
+ catch {
81
+ socket.destroy();
82
+ return false;
83
+ }
84
+ }
85
+ /** Authenticate the CLI-side relay before piping untrusted MCP stdio. */
86
+ export async function sendMcpGatewayHandshake(socket, token) {
87
+ socket.write(`${MCP_GATEWAY_HANDSHAKE_PREFIX}${token}\n`);
88
+ const response = await readSocketLine(socket);
89
+ if (response !== MCP_GATEWAY_HANDSHAKE_OK) {
90
+ throw new Error('Botmux MCP Gateway authentication failed');
91
+ }
92
+ socket.resume();
93
+ }
94
+ //# sourceMappingURL=socket-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-auth.js","sourceRoot":"","sources":["../../../../src/core/plugins/mcp/socket-auth.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,12 @@ export declare function pluginRegistryPath(): string;
3
3
  export declare function pluginsHome(): string;
4
4
  export declare function pluginHome(pluginId: string): string;
5
5
  export declare function pluginRuntimeDir(pluginId: string): string;
6
+ export declare function pluginPrivateDir(pluginId: string): string;
7
+ export declare function pluginMcpPrivatePath(pluginId: string): string;
6
8
  export declare function pluginConfigPath(pluginId: string): string;
7
9
  export declare function pluginSettingsPath(pluginId: string): string;
8
10
  export declare function pluginServiceStatePath(pluginId: string): string;
11
+ export declare function pluginServicePm2ConfigPath(pluginId: string): string;
9
12
  export declare function pluginMaterializedPath(pluginId: string): string;
10
13
  export declare function ensurePluginHome(pluginId: string): string;
11
14
  export declare function ensurePluginRegistryDir(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/core/plugins/paths.ts"],"names":[],"mappings":"AAKA,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIzD;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAS,GAAG,MAAM,CAQjF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,SAAS,GAAG,MAAM,CAO/F"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/core/plugins/paths.ts"],"names":[],"mappings":"AAKA,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIzD;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAS,GAAG,MAAM,CAQjF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,SAAS,GAAG,MAAM,CAO/F"}
@@ -17,6 +17,12 @@ export function pluginHome(pluginId) {
17
17
  export function pluginRuntimeDir(pluginId) {
18
18
  return join(pluginHome(pluginId), 'dist');
19
19
  }
20
+ export function pluginPrivateDir(pluginId) {
21
+ return join(pluginHome(pluginId), 'private');
22
+ }
23
+ export function pluginMcpPrivatePath(pluginId) {
24
+ return join(pluginPrivateDir(pluginId), 'mcp.json');
25
+ }
20
26
  export function pluginConfigPath(pluginId) {
21
27
  return join(pluginHome(pluginId), 'config.json');
22
28
  }
@@ -26,6 +32,9 @@ export function pluginSettingsPath(pluginId) {
26
32
  export function pluginServiceStatePath(pluginId) {
27
33
  return join(pluginHome(pluginId), 'service.json');
28
34
  }
35
+ export function pluginServicePm2ConfigPath(pluginId) {
36
+ return join(pluginHome(pluginId), 'service.pm2.json');
37
+ }
29
38
  export function pluginMaterializedPath(pluginId) {
30
39
  return join(pluginHome(pluginId), 'materialized.json');
31
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/core/plugins/paths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/core/plugins/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,uBAAuB,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,QAAgB;IACzD,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACjC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,SAAS,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,IAAY,EAAE,KAAK,GAAG,MAAM;IACvE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;IACzF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,UAAU,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,KAAK,mBAAmB,CAAC,CAAC;IAC7E,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,KAAK,eAAe,CAAC,CAAC;IAC/F,IAAI,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,KAAK,eAAe,CAAC,CAAC;IAC5G,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,YAAoB,EAAE,KAAK,GAAG,MAAM;IACrF,MAAM,IAAI,GAAG,4BAA4B,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,KAAK,eAAe,CAAC,CAAC;IACrG,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"pm2.d.ts","sourceRoot":"","sources":["../../../src/core/plugins/pm2.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,eAAe,QAA2B,CAAC;AACxD,eAAO,MAAM,iBAAiB,mBAAmB,CAAC;AAElD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAmBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAAG,IAAI,CAarI;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAAG,MAAM,CAexH"}
1
+ {"version":3,"file":"pm2.d.ts","sourceRoot":"","sources":["../../../src/core/plugins/pm2.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,eAAe,QAA2B,CAAC;AACxD,eAAO,MAAM,iBAAiB,mBAAmB,CAAC;AAElD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAqBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAAG,IAAI,CAarI;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAAG,MAAM,CAexH"}