ssh-agent-workspace 1.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 (188) hide show
  1. package/README.md +319 -0
  2. package/dist/__tests__/SSHManager.test.d.ts +2 -0
  3. package/dist/__tests__/SSHManager.test.d.ts.map +1 -0
  4. package/dist/__tests__/SSHManager.test.js +134 -0
  5. package/dist/__tests__/SSHManager.test.js.map +1 -0
  6. package/dist/__tests__/SessionManager.test.d.ts +2 -0
  7. package/dist/__tests__/SessionManager.test.d.ts.map +1 -0
  8. package/dist/__tests__/SessionManager.test.js +141 -0
  9. package/dist/__tests__/SessionManager.test.js.map +1 -0
  10. package/dist/__tests__/StorageManager.test.d.ts +2 -0
  11. package/dist/__tests__/StorageManager.test.d.ts.map +1 -0
  12. package/dist/__tests__/StorageManager.test.js +171 -0
  13. package/dist/__tests__/StorageManager.test.js.map +1 -0
  14. package/dist/__tests__/ansi.test.d.ts +2 -0
  15. package/dist/__tests__/ansi.test.d.ts.map +1 -0
  16. package/dist/__tests__/ansi.test.js +41 -0
  17. package/dist/__tests__/ansi.test.js.map +1 -0
  18. package/dist/__tests__/security.test.d.ts +2 -0
  19. package/dist/__tests__/security.test.d.ts.map +1 -0
  20. package/dist/__tests__/security.test.js +87 -0
  21. package/dist/__tests__/security.test.js.map +1 -0
  22. package/dist/__tests__/validation.test.d.ts +2 -0
  23. package/dist/__tests__/validation.test.d.ts.map +1 -0
  24. package/dist/__tests__/validation.test.js +23 -0
  25. package/dist/__tests__/validation.test.js.map +1 -0
  26. package/dist/core/HostSecurityManager.d.ts +25 -0
  27. package/dist/core/HostSecurityManager.d.ts.map +1 -0
  28. package/dist/core/HostSecurityManager.js +76 -0
  29. package/dist/core/HostSecurityManager.js.map +1 -0
  30. package/dist/core/SSHManager.d.ts +48 -0
  31. package/dist/core/SSHManager.d.ts.map +1 -0
  32. package/dist/core/SSHManager.js +288 -0
  33. package/dist/core/SSHManager.js.map +1 -0
  34. package/dist/core/SessionManager.d.ts +15 -0
  35. package/dist/core/SessionManager.d.ts.map +1 -0
  36. package/dist/core/SessionManager.js +96 -0
  37. package/dist/core/SessionManager.js.map +1 -0
  38. package/dist/core/StorageManager.d.ts +27 -0
  39. package/dist/core/StorageManager.d.ts.map +1 -0
  40. package/dist/core/StorageManager.js +87 -0
  41. package/dist/core/StorageManager.js.map +1 -0
  42. package/dist/core/TmuxManager.d.ts +21 -0
  43. package/dist/core/TmuxManager.d.ts.map +1 -0
  44. package/dist/core/TmuxManager.js +110 -0
  45. package/dist/core/TmuxManager.js.map +1 -0
  46. package/dist/core/ToolConfigManager.d.ts +15 -0
  47. package/dist/core/ToolConfigManager.d.ts.map +1 -0
  48. package/dist/core/ToolConfigManager.js +57 -0
  49. package/dist/core/ToolConfigManager.js.map +1 -0
  50. package/dist/index.d.ts +3 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +169 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/server.d.ts +44 -0
  55. package/dist/server.d.ts.map +1 -0
  56. package/dist/server.js +152 -0
  57. package/dist/server.js.map +1 -0
  58. package/dist/tools/backup.d.ts +74 -0
  59. package/dist/tools/backup.d.ts.map +1 -0
  60. package/dist/tools/backup.js +152 -0
  61. package/dist/tools/backup.js.map +1 -0
  62. package/dist/tools/connect.d.ts +46 -0
  63. package/dist/tools/connect.d.ts.map +1 -0
  64. package/dist/tools/connect.js +235 -0
  65. package/dist/tools/connect.js.map +1 -0
  66. package/dist/tools/connection_status.d.ts +39 -0
  67. package/dist/tools/connection_status.d.ts.map +1 -0
  68. package/dist/tools/connection_status.js +67 -0
  69. package/dist/tools/connection_status.js.map +1 -0
  70. package/dist/tools/db_query.d.ts +103 -0
  71. package/dist/tools/db_query.d.ts.map +1 -0
  72. package/dist/tools/db_query.js +194 -0
  73. package/dist/tools/db_query.js.map +1 -0
  74. package/dist/tools/deploy.d.ts +127 -0
  75. package/dist/tools/deploy.d.ts.map +1 -0
  76. package/dist/tools/deploy.js +201 -0
  77. package/dist/tools/deploy.js.map +1 -0
  78. package/dist/tools/disconnect.d.ts +46 -0
  79. package/dist/tools/disconnect.d.ts.map +1 -0
  80. package/dist/tools/disconnect.js +77 -0
  81. package/dist/tools/disconnect.js.map +1 -0
  82. package/dist/tools/exec.d.ts +69 -0
  83. package/dist/tools/exec.d.ts.map +1 -0
  84. package/dist/tools/exec.js +188 -0
  85. package/dist/tools/exec.js.map +1 -0
  86. package/dist/tools/group_exec.d.ts +80 -0
  87. package/dist/tools/group_exec.d.ts.map +1 -0
  88. package/dist/tools/group_exec.js +150 -0
  89. package/dist/tools/group_exec.js.map +1 -0
  90. package/dist/tools/health_check.d.ts +38 -0
  91. package/dist/tools/health_check.d.ts.map +1 -0
  92. package/dist/tools/health_check.js +161 -0
  93. package/dist/tools/health_check.js.map +1 -0
  94. package/dist/tools/host_security.d.ts +52 -0
  95. package/dist/tools/host_security.d.ts.map +1 -0
  96. package/dist/tools/host_security.js +127 -0
  97. package/dist/tools/host_security.js.map +1 -0
  98. package/dist/tools/index.d.ts +24 -0
  99. package/dist/tools/index.d.ts.map +1 -0
  100. package/dist/tools/index.js +24 -0
  101. package/dist/tools/index.js.map +1 -0
  102. package/dist/tools/interrupt.d.ts +47 -0
  103. package/dist/tools/interrupt.d.ts.map +1 -0
  104. package/dist/tools/interrupt.js +77 -0
  105. package/dist/tools/interrupt.js.map +1 -0
  106. package/dist/tools/list_hosts.d.ts +15 -0
  107. package/dist/tools/list_hosts.d.ts.map +1 -0
  108. package/dist/tools/list_hosts.js +18 -0
  109. package/dist/tools/list_hosts.js.map +1 -0
  110. package/dist/tools/list_sessions.d.ts +16 -0
  111. package/dist/tools/list_sessions.d.ts.map +1 -0
  112. package/dist/tools/list_sessions.js +20 -0
  113. package/dist/tools/list_sessions.js.map +1 -0
  114. package/dist/tools/read_output.d.ts +46 -0
  115. package/dist/tools/read_output.d.ts.map +1 -0
  116. package/dist/tools/read_output.js +73 -0
  117. package/dist/tools/read_output.js.map +1 -0
  118. package/dist/tools/reconnect_to_tmux.d.ts +53 -0
  119. package/dist/tools/reconnect_to_tmux.d.ts.map +1 -0
  120. package/dist/tools/reconnect_to_tmux.js +199 -0
  121. package/dist/tools/reconnect_to_tmux.js.map +1 -0
  122. package/dist/tools/send_input.d.ts +45 -0
  123. package/dist/tools/send_input.d.ts.map +1 -0
  124. package/dist/tools/send_input.js +83 -0
  125. package/dist/tools/send_input.js.map +1 -0
  126. package/dist/tools/sftp_download.d.ts +52 -0
  127. package/dist/tools/sftp_download.d.ts.map +1 -0
  128. package/dist/tools/sftp_download.js +90 -0
  129. package/dist/tools/sftp_download.js.map +1 -0
  130. package/dist/tools/sftp_list.d.ts +46 -0
  131. package/dist/tools/sftp_list.d.ts.map +1 -0
  132. package/dist/tools/sftp_list.js +93 -0
  133. package/dist/tools/sftp_list.js.map +1 -0
  134. package/dist/tools/sftp_upload.d.ts +52 -0
  135. package/dist/tools/sftp_upload.d.ts.map +1 -0
  136. package/dist/tools/sftp_upload.js +98 -0
  137. package/dist/tools/sftp_upload.js.map +1 -0
  138. package/dist/tools/ssh_tunnel.d.ts +116 -0
  139. package/dist/tools/ssh_tunnel.d.ts.map +1 -0
  140. package/dist/tools/ssh_tunnel.js +282 -0
  141. package/dist/tools/ssh_tunnel.js.map +1 -0
  142. package/dist/tools/sync.d.ts +71 -0
  143. package/dist/tools/sync.d.ts.map +1 -0
  144. package/dist/tools/sync.js +310 -0
  145. package/dist/tools/sync.js.map +1 -0
  146. package/dist/tools/tail_log.d.ts +61 -0
  147. package/dist/tools/tail_log.d.ts.map +1 -0
  148. package/dist/tools/tail_log.js +111 -0
  149. package/dist/tools/tail_log.js.map +1 -0
  150. package/dist/tools/tools_config.d.ts +34 -0
  151. package/dist/tools/tools_config.d.ts.map +1 -0
  152. package/dist/tools/tools_config.js +98 -0
  153. package/dist/tools/tools_config.js.map +1 -0
  154. package/dist/types/index.d.ts +21 -0
  155. package/dist/types/index.d.ts.map +1 -0
  156. package/dist/types/index.js +2 -0
  157. package/dist/types/index.js.map +1 -0
  158. package/dist/utils/ansi.d.ts +2 -0
  159. package/dist/utils/ansi.d.ts.map +1 -0
  160. package/dist/utils/ansi.js +7 -0
  161. package/dist/utils/ansi.js.map +1 -0
  162. package/dist/utils/logger.d.ts +3 -0
  163. package/dist/utils/logger.d.ts.map +1 -0
  164. package/dist/utils/logger.js +8 -0
  165. package/dist/utils/logger.js.map +1 -0
  166. package/dist/utils/security.d.ts +7 -0
  167. package/dist/utils/security.d.ts.map +1 -0
  168. package/dist/utils/security.js +58 -0
  169. package/dist/utils/security.js.map +1 -0
  170. package/dist/utils/ssh.d.ts +4 -0
  171. package/dist/utils/ssh.d.ts.map +1 -0
  172. package/dist/utils/ssh.js +29 -0
  173. package/dist/utils/ssh.js.map +1 -0
  174. package/dist/utils/sshConfig.d.ts +4 -0
  175. package/dist/utils/sshConfig.d.ts.map +1 -0
  176. package/dist/utils/sshConfig.js +85 -0
  177. package/dist/utils/sshConfig.js.map +1 -0
  178. package/dist/utils/validation.d.ts +4 -0
  179. package/dist/utils/validation.d.ts.map +1 -0
  180. package/dist/utils/validation.js +12 -0
  181. package/dist/utils/validation.js.map +1 -0
  182. package/docs/SECURITY.md +213 -0
  183. package/docs/TOOLS.md +425 -0
  184. package/keygen.bat +325 -0
  185. package/package.json +48 -0
  186. package/test_check.bat +9 -0
  187. package/test_delayed.bat +12 -0
  188. package/vitest.config.ts +14 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/tools/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { z } from 'zod';
2
+ import { SessionManager } from '../core/SessionManager.js';
3
+ import { TmuxManager } from '../core/TmuxManager.js';
4
+ export declare const disconnectSchema: z.ZodObject<{
5
+ session_id: z.ZodString;
6
+ preserve_tmux: z.ZodDefault<z.ZodBoolean>;
7
+ }, "strip", z.ZodTypeAny, {
8
+ session_id: string;
9
+ preserve_tmux: boolean;
10
+ }, {
11
+ session_id: string;
12
+ preserve_tmux?: boolean | undefined;
13
+ }>;
14
+ export declare const disconnectTool: {
15
+ name: string;
16
+ description: string;
17
+ inputSchema: {
18
+ type: "object";
19
+ properties: {
20
+ session_id: {
21
+ type: string;
22
+ description: string;
23
+ };
24
+ preserve_tmux: {
25
+ type: string;
26
+ description: string;
27
+ default: boolean;
28
+ };
29
+ };
30
+ required: string[];
31
+ };
32
+ };
33
+ export declare function handleDisconnect(args: unknown, sessionManager: SessionManager, tmuxManager: TmuxManager): Promise<{
34
+ content: {
35
+ type: "text";
36
+ text: string;
37
+ }[];
38
+ isError: boolean;
39
+ } | {
40
+ content: {
41
+ type: "text";
42
+ text: string;
43
+ }[];
44
+ isError?: undefined;
45
+ }>;
46
+ //# sourceMappingURL=disconnect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disconnect.d.ts","sourceRoot":"","sources":["../../src/tools/disconnect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,eAAO,MAAM,gBAAgB;;;;;;;;;EAM3B,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;CAmB1B,CAAC;AAEF,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,OAAO,EACb,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW;;;;;;;;;;;;GA2DzB"}
@@ -0,0 +1,77 @@
1
+ import { z } from 'zod';
2
+ import { logger } from '../utils/logger.js';
3
+ export const disconnectSchema = z.object({
4
+ session_id: z.string().min(1),
5
+ preserve_tmux: z
6
+ .boolean()
7
+ .default(true)
8
+ .describe('If false, the remote tmux session will be killed'),
9
+ });
10
+ export const disconnectTool = {
11
+ name: 'disconnect',
12
+ description: 'Disconnect from a session. Optionally kills the remote tmux session or leaves it running for reconnection.',
13
+ inputSchema: {
14
+ type: 'object',
15
+ properties: {
16
+ session_id: {
17
+ type: 'string',
18
+ description: 'Session ID returned by connect',
19
+ },
20
+ preserve_tmux: {
21
+ type: 'boolean',
22
+ description: 'Keep the tmux session running on the remote host (default: true)',
23
+ default: true,
24
+ },
25
+ },
26
+ required: ['session_id'],
27
+ },
28
+ };
29
+ export async function handleDisconnect(args, sessionManager, tmuxManager) {
30
+ const parsed = disconnectSchema.safeParse(args);
31
+ if (!parsed.success) {
32
+ return {
33
+ content: [
34
+ {
35
+ type: 'text',
36
+ text: `Invalid arguments: ${parsed.error.message}`,
37
+ },
38
+ ],
39
+ isError: true,
40
+ };
41
+ }
42
+ const { session_id, preserve_tmux } = parsed.data;
43
+ const session = sessionManager.get(session_id);
44
+ if (!session) {
45
+ return {
46
+ content: [
47
+ {
48
+ type: 'text',
49
+ text: `Error: Session '${session_id}' not found or has already been disconnected`,
50
+ },
51
+ ],
52
+ isError: true,
53
+ };
54
+ }
55
+ if (!preserve_tmux) {
56
+ try {
57
+ await tmuxManager.killSession(session.ssh, session.tmuxSession);
58
+ }
59
+ catch (err) {
60
+ logger.warn({ sessionId: session_id, error: err.message }, 'Failed to kill tmux session during disconnect');
61
+ }
62
+ }
63
+ const removed = sessionManager.remove(session_id);
64
+ return {
65
+ content: [
66
+ {
67
+ type: 'text',
68
+ text: JSON.stringify({
69
+ status: removed ? 'disconnected' : 'not_found',
70
+ session_id,
71
+ preserve_tmux,
72
+ }, null, 2),
73
+ },
74
+ ],
75
+ };
76
+ }
77
+ //# sourceMappingURL=disconnect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disconnect.js","sourceRoot":"","sources":["../../src/tools/disconnect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,aAAa,EAAE,CAAC;SACb,OAAO,EAAE;SACT,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,kDAAkD,CAAC;CAChE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,YAAY;IAClB,WAAW,EACT,4GAA4G;IAC9G,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gCAAgC;aAC9C;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,kEAAkE;gBAC/E,OAAO,EAAE,IAAI;aACd;SACF;QACD,QAAQ,EAAE,CAAC,YAAY,CAAC;KACzB;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAa,EACb,cAA8B,EAC9B,WAAwB;IAExB,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,sBAAsB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;iBACnD;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAClD,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAE/C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,mBAAmB,UAAU,8CAA8C;iBAClF;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CACT,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,EACxD,+CAA+C,CAChD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAElD,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW;oBAC9C,UAAU;oBACV,aAAa;iBACd,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { z } from 'zod';
2
+ import { SessionManager } from '../core/SessionManager.js';
3
+ import { TmuxManager } from '../core/TmuxManager.js';
4
+ export declare const execSchema: z.ZodObject<{
5
+ session_id: z.ZodString;
6
+ command: z.ZodString;
7
+ wait_ms: z.ZodDefault<z.ZodNumber>;
8
+ max_wait_ms: z.ZodDefault<z.ZodNumber>;
9
+ lines: z.ZodDefault<z.ZodNumber>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ session_id: string;
12
+ lines: number;
13
+ command: string;
14
+ wait_ms: number;
15
+ max_wait_ms: number;
16
+ }, {
17
+ session_id: string;
18
+ command: string;
19
+ lines?: number | undefined;
20
+ wait_ms?: number | undefined;
21
+ max_wait_ms?: number | undefined;
22
+ }>;
23
+ export declare const execTool: {
24
+ name: string;
25
+ description: string;
26
+ inputSchema: {
27
+ type: "object";
28
+ properties: {
29
+ session_id: {
30
+ type: string;
31
+ description: string;
32
+ };
33
+ command: {
34
+ type: string;
35
+ description: string;
36
+ };
37
+ wait_ms: {
38
+ type: string;
39
+ description: string;
40
+ default: number;
41
+ };
42
+ max_wait_ms: {
43
+ type: string;
44
+ description: string;
45
+ default: number;
46
+ };
47
+ lines: {
48
+ type: string;
49
+ description: string;
50
+ default: number;
51
+ };
52
+ };
53
+ required: string[];
54
+ };
55
+ };
56
+ export declare function handleExec(args: unknown, sessionManager: SessionManager, tmuxManager: TmuxManager): Promise<{
57
+ content: {
58
+ type: "text";
59
+ text: string;
60
+ }[];
61
+ isError: boolean;
62
+ } | {
63
+ content: {
64
+ type: "text";
65
+ text: string;
66
+ }[];
67
+ isError?: undefined;
68
+ }>;
69
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/tools/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAc,MAAM,wBAAwB,CAAC;AAKjE,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;EAqBrB,CAAC;AAEH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCpB,CAAC;AA6BF,wBAAsB,UAAU,CAC9B,IAAI,EAAE,OAAO,EACb,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW;;;;;;;;;;;;GAgIzB"}
@@ -0,0 +1,188 @@
1
+ import { z } from 'zod';
2
+ import { MCP_PROMPT } from '../core/TmuxManager.js';
3
+ import { isReadOnlyMode, isCommandDenied } from '../utils/security.js';
4
+ import { logger } from '../utils/logger.js';
5
+ import { stripAnsi } from '../utils/ansi.js';
6
+ export const execSchema = z.object({
7
+ session_id: z.string().min(1),
8
+ command: z.string().min(1),
9
+ wait_ms: z
10
+ .number()
11
+ .min(0)
12
+ .max(60000)
13
+ .default(200)
14
+ .describe('Minimum milliseconds to wait before starting prompt detection'),
15
+ max_wait_ms: z
16
+ .number()
17
+ .min(0)
18
+ .max(300000)
19
+ .default(10000)
20
+ .describe('Maximum total milliseconds to wait for prompt stabilization'),
21
+ lines: z
22
+ .number()
23
+ .min(1)
24
+ .max(10000)
25
+ .default(200)
26
+ .describe('Number of output lines to capture'),
27
+ });
28
+ export const execTool = {
29
+ name: 'exec',
30
+ description: 'Execute a command in a persistent tmux session with prompt stabilization. Sends the command, waits for the deterministic prompt to appear, then captures output.',
31
+ inputSchema: {
32
+ type: 'object',
33
+ properties: {
34
+ session_id: {
35
+ type: 'string',
36
+ description: 'Session ID returned by connect',
37
+ },
38
+ command: {
39
+ type: 'string',
40
+ description: 'Command to execute',
41
+ },
42
+ wait_ms: {
43
+ type: 'number',
44
+ description: 'Minimum milliseconds to wait before starting prompt detection (default: 200)',
45
+ default: 200,
46
+ },
47
+ max_wait_ms: {
48
+ type: 'number',
49
+ description: 'Maximum total milliseconds to wait for prompt stabilization (default: 10000)',
50
+ default: 10000,
51
+ },
52
+ lines: {
53
+ type: 'number',
54
+ description: 'Number of output lines to capture (default: 200)',
55
+ default: 200,
56
+ },
57
+ },
58
+ required: ['session_id', 'command'],
59
+ },
60
+ };
61
+ function outputContainsPrompt(output) {
62
+ const lines = output.split('\n');
63
+ for (let i = lines.length - 1; i >= 0; i--) {
64
+ const line = lines[i].trim();
65
+ if (line === '')
66
+ continue;
67
+ // The prompt should be at the very end of the last non-empty line
68
+ return line.includes(MCP_PROMPT.trim());
69
+ }
70
+ return false;
71
+ }
72
+ function stripPrompts(output) {
73
+ const lines = output.split('\n');
74
+ const cleaned = [];
75
+ for (const line of lines) {
76
+ if (line.trim() === MCP_PROMPT.trim()) {
77
+ continue;
78
+ }
79
+ if (line.trimEnd().endsWith(MCP_PROMPT.trim())) {
80
+ cleaned.push(line.trimEnd().replace(MCP_PROMPT.trim(), '').trimEnd());
81
+ }
82
+ else {
83
+ cleaned.push(line);
84
+ }
85
+ }
86
+ return cleaned.join('\n').trimEnd();
87
+ }
88
+ export async function handleExec(args, sessionManager, tmuxManager) {
89
+ const parsed = execSchema.safeParse(args);
90
+ if (!parsed.success) {
91
+ return {
92
+ content: [
93
+ {
94
+ type: 'text',
95
+ text: `Invalid arguments: ${parsed.error.message}`,
96
+ },
97
+ ],
98
+ isError: true,
99
+ };
100
+ }
101
+ const { session_id, command, wait_ms, max_wait_ms, lines } = parsed.data;
102
+ if (isCommandDenied(command)) {
103
+ logger.warn({ sessionId: session_id, command }, 'Command rejected by denylist');
104
+ return {
105
+ content: [
106
+ {
107
+ type: 'text',
108
+ text: `Error: Command '${command}' is denied by security policy`,
109
+ },
110
+ ],
111
+ isError: true,
112
+ };
113
+ }
114
+ const session = sessionManager.get(session_id);
115
+ if (!session) {
116
+ return {
117
+ content: [
118
+ {
119
+ type: 'text',
120
+ text: `Error: Session '${session_id}' not found or has been disconnected`,
121
+ },
122
+ ],
123
+ isError: true,
124
+ };
125
+ }
126
+ if (isReadOnlyMode(session.host)) {
127
+ return {
128
+ content: [
129
+ {
130
+ type: 'text',
131
+ text: `Error: Host '${session.host}' is in read-only mode. Command execution is disabled.`,
132
+ },
133
+ ],
134
+ isError: true,
135
+ };
136
+ }
137
+ try {
138
+ await tmuxManager.sendCommand(session.ssh, session.tmuxSession, command);
139
+ logger.info({ sessionId: session_id, command }, 'Command sent');
140
+ }
141
+ catch (err) {
142
+ logger.error({ sessionId: session_id, error: err.message }, 'Failed to send command');
143
+ return {
144
+ content: [
145
+ {
146
+ type: 'text',
147
+ text: `Error: Failed to send command: ${err.message}`,
148
+ },
149
+ ],
150
+ isError: true,
151
+ };
152
+ }
153
+ // Prompt stabilization
154
+ const pollInterval = 250;
155
+ let elapsed = 0;
156
+ if (wait_ms > 0) {
157
+ await new Promise((resolve) => setTimeout(resolve, wait_ms));
158
+ elapsed += wait_ms;
159
+ }
160
+ let output = '';
161
+ let stabilized = false;
162
+ while (elapsed < max_wait_ms) {
163
+ let captureFailed = false;
164
+ try {
165
+ output = await tmuxManager.capturePane(session.ssh, session.tmuxSession, lines);
166
+ }
167
+ catch (err) {
168
+ captureFailed = true;
169
+ logger.warn({ sessionId: session_id, error: err.message, attempt: Math.floor(elapsed / pollInterval) }, 'capturePane failed, retrying');
170
+ }
171
+ if (!captureFailed && outputContainsPrompt(output)) {
172
+ stabilized = true;
173
+ logger.info({ sessionId: session_id, elapsedMs: elapsed }, 'Prompt stabilized');
174
+ break;
175
+ }
176
+ await new Promise((resolve) => setTimeout(resolve, pollInterval));
177
+ elapsed += pollInterval;
178
+ }
179
+ if (!stabilized) {
180
+ logger.warn({ sessionId: session_id, max_wait_ms }, 'Prompt did not stabilize within max_wait_ms; returning current output');
181
+ }
182
+ const cleanedOutput = stripPrompts(output);
183
+ const sanitizedOutput = stripAnsi(cleanedOutput);
184
+ return {
185
+ content: [{ type: 'text', text: sanitizedOutput }],
186
+ };
187
+ }
188
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/tools/exec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import { z } from 'zod';
2
+ import { SessionManager } from '../core/SessionManager.js';
3
+ import { TmuxManager } from '../core/TmuxManager.js';
4
+ export declare const groupExecSchema: z.ZodObject<{
5
+ session_ids: z.ZodArray<z.ZodString, "many">;
6
+ command: z.ZodString;
7
+ wait_ms: z.ZodDefault<z.ZodNumber>;
8
+ max_wait_ms: z.ZodDefault<z.ZodNumber>;
9
+ lines: z.ZodDefault<z.ZodNumber>;
10
+ parallel: z.ZodDefault<z.ZodBoolean>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ lines: number;
13
+ command: string;
14
+ wait_ms: number;
15
+ max_wait_ms: number;
16
+ session_ids: string[];
17
+ parallel: boolean;
18
+ }, {
19
+ command: string;
20
+ session_ids: string[];
21
+ lines?: number | undefined;
22
+ wait_ms?: number | undefined;
23
+ max_wait_ms?: number | undefined;
24
+ parallel?: boolean | undefined;
25
+ }>;
26
+ export declare const groupExecTool: {
27
+ name: string;
28
+ description: string;
29
+ inputSchema: {
30
+ type: "object";
31
+ properties: {
32
+ session_ids: {
33
+ type: string;
34
+ items: {
35
+ type: string;
36
+ };
37
+ description: string;
38
+ };
39
+ command: {
40
+ type: string;
41
+ description: string;
42
+ };
43
+ wait_ms: {
44
+ type: string;
45
+ description: string;
46
+ default: number;
47
+ };
48
+ max_wait_ms: {
49
+ type: string;
50
+ description: string;
51
+ default: number;
52
+ };
53
+ lines: {
54
+ type: string;
55
+ description: string;
56
+ default: number;
57
+ };
58
+ parallel: {
59
+ type: string;
60
+ description: string;
61
+ default: boolean;
62
+ };
63
+ };
64
+ required: string[];
65
+ };
66
+ };
67
+ export declare function handleGroupExec(args: unknown, sessionManager: SessionManager, tmuxManager: TmuxManager): Promise<{
68
+ content: {
69
+ type: "text";
70
+ text: string;
71
+ }[];
72
+ isError: boolean;
73
+ } | {
74
+ content: {
75
+ type: "text";
76
+ text: string;
77
+ }[];
78
+ isError?: undefined;
79
+ }>;
80
+ //# sourceMappingURL=group_exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group_exec.d.ts","sourceRoot":"","sources":["../../src/tools/group_exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAc,MAAM,wBAAwB,CAAC;AAKjE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;EAO1B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoBzB,CAAC;AAoFF,wBAAsB,eAAe,CACnC,IAAI,EAAE,OAAO,EACb,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW;;;;;;;;;;;;GA6DzB"}
@@ -0,0 +1,150 @@
1
+ import { z } from 'zod';
2
+ import { MCP_PROMPT } from '../core/TmuxManager.js';
3
+ import { isReadOnlyMode, isCommandDenied } from '../utils/security.js';
4
+ import { logger } from '../utils/logger.js';
5
+ import { stripAnsi } from '../utils/ansi.js';
6
+ export const groupExecSchema = z.object({
7
+ session_ids: z.array(z.string().min(1)).min(1).max(20).describe('Array of session IDs to execute the command on'),
8
+ command: z.string().min(1).describe('Command to execute on all sessions'),
9
+ wait_ms: z.number().min(0).max(60000).default(200).describe('Minimum ms before prompt detection per session'),
10
+ max_wait_ms: z.number().min(0).max(300000).default(10000).describe('Maximum ms to wait for prompt per session'),
11
+ lines: z.number().min(1).max(10000).default(200).describe('Output lines per session'),
12
+ parallel: z.boolean().default(true).describe('Run commands in parallel (true) or sequentially (false)'),
13
+ });
14
+ export const groupExecTool = {
15
+ name: 'group_exec',
16
+ description: 'Execute the same command across multiple tmux sessions simultaneously or sequentially. Useful for managing clusters. Returns per-session results with host and exit status.',
17
+ inputSchema: {
18
+ type: 'object',
19
+ properties: {
20
+ session_ids: {
21
+ type: 'array',
22
+ items: { type: 'string' },
23
+ description: 'Array of session IDs to target',
24
+ },
25
+ command: { type: 'string', description: 'Command to execute' },
26
+ wait_ms: { type: 'number', description: 'Min ms before prompt detection (default: 200)', default: 200 },
27
+ max_wait_ms: { type: 'number', description: 'Max ms for prompt per session (default: 10000)', default: 10000 },
28
+ lines: { type: 'number', description: 'Output lines per session (default: 200)', default: 200 },
29
+ parallel: { type: 'boolean', description: 'Execute in parallel (default: true)', default: true },
30
+ },
31
+ required: ['session_ids', 'command'],
32
+ },
33
+ };
34
+ function outputContainsPrompt(output) {
35
+ const lines = output.split('\n');
36
+ for (let i = lines.length - 1; i >= 0; i--) {
37
+ const line = lines[i].trim();
38
+ if (line === '')
39
+ continue;
40
+ return line.includes(MCP_PROMPT.trim());
41
+ }
42
+ return false;
43
+ }
44
+ function stripPrompts(output) {
45
+ const lines = output.split('\n');
46
+ const cleaned = [];
47
+ for (const line of lines) {
48
+ if (line.trim() === MCP_PROMPT.trim())
49
+ continue;
50
+ if (line.trimEnd().endsWith(MCP_PROMPT.trim())) {
51
+ cleaned.push(line.trimEnd().replace(MCP_PROMPT.trim(), '').trimEnd());
52
+ }
53
+ else {
54
+ cleaned.push(line);
55
+ }
56
+ }
57
+ return cleaned.join('\n').trimEnd();
58
+ }
59
+ async function executeOnSession(session_id, command, wait_ms, max_wait_ms, lines, sessionManager, tmuxManager) {
60
+ const session = sessionManager.get(session_id);
61
+ if (!session) {
62
+ return { session_id, host: 'unknown', status: 'error', error: 'Session not found' };
63
+ }
64
+ if (isReadOnlyMode(session.host)) {
65
+ return { session_id, host: session.host, status: 'error', error: `Host '${session.host}' is in read-only mode` };
66
+ }
67
+ try {
68
+ await tmuxManager.sendCommand(session.ssh, session.tmuxSession, command);
69
+ }
70
+ catch (err) {
71
+ return { session_id, host: session.host, status: 'error', error: `Send failed: ${err.message}` };
72
+ }
73
+ const pollInterval = 250;
74
+ let elapsed = 0;
75
+ if (wait_ms > 0) {
76
+ await new Promise((r) => setTimeout(r, wait_ms));
77
+ elapsed += wait_ms;
78
+ }
79
+ let output = '';
80
+ let stabilized = false;
81
+ while (elapsed < max_wait_ms) {
82
+ try {
83
+ output = await tmuxManager.capturePane(session.ssh, session.tmuxSession, lines);
84
+ if (outputContainsPrompt(output)) {
85
+ stabilized = true;
86
+ break;
87
+ }
88
+ }
89
+ catch { /* retry */ }
90
+ await new Promise((r) => setTimeout(r, pollInterval));
91
+ elapsed += pollInterval;
92
+ }
93
+ const cleaned = stripAnsi(stripPrompts(output));
94
+ return {
95
+ session_id,
96
+ host: session.host,
97
+ status: stabilized ? 'success' : 'timeout',
98
+ output: cleaned,
99
+ stabilized,
100
+ };
101
+ }
102
+ export async function handleGroupExec(args, sessionManager, tmuxManager) {
103
+ const parsed = groupExecSchema.safeParse(args);
104
+ if (!parsed.success) {
105
+ return { content: [{ type: 'text', text: `Invalid arguments: ${parsed.error.message}` }], isError: true };
106
+ }
107
+ const { session_ids, command, wait_ms, max_wait_ms, lines, parallel } = parsed.data;
108
+ if (isCommandDenied(command)) {
109
+ return {
110
+ content: [{ type: 'text', text: `Error: Command '${command}' is denied by security policy` }],
111
+ isError: true,
112
+ };
113
+ }
114
+ const uniqueIds = [...new Set(session_ids)];
115
+ const missing = uniqueIds.filter((id) => !sessionManager.has(id));
116
+ if (missing.length > 0) {
117
+ return {
118
+ content: [{ type: 'text', text: `Error: Sessions not found: ${missing.join(', ')}` }],
119
+ isError: true,
120
+ };
121
+ }
122
+ let results;
123
+ if (parallel) {
124
+ results = await Promise.all(uniqueIds.map((id) => executeOnSession(id, command, wait_ms, max_wait_ms, lines, sessionManager, tmuxManager)));
125
+ }
126
+ else {
127
+ results = [];
128
+ for (const id of uniqueIds) {
129
+ results.push(await executeOnSession(id, command, wait_ms, max_wait_ms, lines, sessionManager, tmuxManager));
130
+ }
131
+ }
132
+ const succeeded = results.filter((r) => r.status === 'success').length;
133
+ const failed = results.filter((r) => r.status === 'error').length;
134
+ const timedOut = results.filter((r) => r.status === 'timeout').length;
135
+ logger.info({ command, sessions: uniqueIds.length, succeeded, failed, timedOut }, 'Group exec complete');
136
+ return {
137
+ content: [{
138
+ type: 'text',
139
+ text: JSON.stringify({
140
+ command,
141
+ sessions_targeted: uniqueIds.length,
142
+ succeeded,
143
+ failed,
144
+ timed_out: timedOut,
145
+ results,
146
+ }, null, 2),
147
+ }],
148
+ };
149
+ }
150
+ //# sourceMappingURL=group_exec.js.map