ssh-agent-workspace 1.0.5 → 1.0.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/README.md +471 -471
- package/dist/__tests__/SSHManager.test.js +59 -37
- package/dist/__tests__/SSHManager.test.js.map +1 -1
- package/dist/__tests__/SessionManager.test.js +53 -51
- package/dist/__tests__/SessionManager.test.js.map +1 -1
- package/dist/__tests__/StorageManager.test.js +74 -74
- package/dist/__tests__/StorageManager.test.js.map +1 -1
- package/dist/__tests__/ansi.test.js +33 -33
- package/dist/__tests__/ansi.test.js.map +1 -1
- package/dist/__tests__/security.test.js +54 -54
- package/dist/__tests__/security.test.js.map +1 -1
- package/dist/__tests__/validation.test.js +17 -17
- package/dist/__tests__/validation.test.js.map +1 -1
- package/dist/core/HostSecurityManager.d.ts.map +1 -1
- package/dist/core/HostSecurityManager.js +9 -9
- package/dist/core/HostSecurityManager.js.map +1 -1
- package/dist/core/SSHManager.d.ts +1 -1
- package/dist/core/SSHManager.d.ts.map +1 -1
- package/dist/core/SSHManager.js +31 -31
- package/dist/core/SSHManager.js.map +1 -1
- package/dist/core/SessionManager.d.ts +4 -4
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +14 -14
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/StorageManager.d.ts.map +1 -1
- package/dist/core/StorageManager.js +11 -11
- package/dist/core/StorageManager.js.map +1 -1
- package/dist/core/TmuxManager.d.ts +3 -3
- package/dist/core/TmuxManager.d.ts.map +1 -1
- package/dist/core/TmuxManager.js +16 -16
- package/dist/core/TmuxManager.js.map +1 -1
- package/dist/core/ToolConfigManager.d.ts.map +1 -1
- package/dist/core/ToolConfigManager.js +10 -10
- package/dist/core/ToolConfigManager.js.map +1 -1
- package/dist/index.js +35 -35
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +4 -4
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +41 -41
- package/dist/server.js.map +1 -1
- package/dist/tools/backup.d.ts +3 -3
- package/dist/tools/backup.d.ts.map +1 -1
- package/dist/tools/backup.js +86 -49
- package/dist/tools/backup.js.map +1 -1
- package/dist/tools/connect.d.ts +4 -4
- package/dist/tools/connect.d.ts.map +1 -1
- package/dist/tools/connect.js +54 -42
- package/dist/tools/connect.js.map +1 -1
- package/dist/tools/connection_status.d.ts +4 -4
- package/dist/tools/connection_status.d.ts.map +1 -1
- package/dist/tools/connection_status.js +23 -16
- package/dist/tools/connection_status.js.map +1 -1
- package/dist/tools/db_query.d.ts +3 -3
- package/dist/tools/db_query.d.ts.map +1 -1
- package/dist/tools/db_query.js +130 -78
- package/dist/tools/db_query.js.map +1 -1
- package/dist/tools/deploy.d.ts +3 -3
- package/dist/tools/deploy.d.ts.map +1 -1
- package/dist/tools/deploy.js +103 -53
- package/dist/tools/deploy.js.map +1 -1
- package/dist/tools/disconnect.d.ts +3 -3
- package/dist/tools/disconnect.d.ts.map +1 -1
- package/dist/tools/disconnect.js +16 -19
- package/dist/tools/disconnect.js.map +1 -1
- package/dist/tools/exec.d.ts +3 -3
- package/dist/tools/exec.d.ts.map +1 -1
- package/dist/tools/exec.js +40 -45
- package/dist/tools/exec.js.map +1 -1
- package/dist/tools/group_exec.d.ts +3 -3
- package/dist/tools/group_exec.d.ts.map +1 -1
- package/dist/tools/group_exec.js +60 -44
- package/dist/tools/group_exec.js.map +1 -1
- package/dist/tools/health_check.d.ts +3 -3
- package/dist/tools/health_check.d.ts.map +1 -1
- package/dist/tools/health_check.js +27 -23
- package/dist/tools/health_check.js.map +1 -1
- package/dist/tools/host_security.d.ts +1 -1
- package/dist/tools/host_security.d.ts.map +1 -1
- package/dist/tools/host_security.js +30 -36
- package/dist/tools/host_security.js.map +1 -1
- package/dist/tools/index.d.ts +23 -23
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +23 -23
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/interrupt.d.ts +3 -3
- package/dist/tools/interrupt.d.ts.map +1 -1
- package/dist/tools/interrupt.js +18 -18
- package/dist/tools/interrupt.js.map +1 -1
- package/dist/tools/list_hosts.d.ts.map +1 -1
- package/dist/tools/list_hosts.js +5 -7
- package/dist/tools/list_hosts.js.map +1 -1
- package/dist/tools/list_sessions.d.ts +1 -1
- package/dist/tools/list_sessions.js +4 -4
- package/dist/tools/list_sessions.js.map +1 -1
- package/dist/tools/read_output.d.ts +3 -3
- package/dist/tools/read_output.d.ts.map +1 -1
- package/dist/tools/read_output.js +17 -17
- package/dist/tools/read_output.js.map +1 -1
- package/dist/tools/reconnect_to_tmux.d.ts +4 -4
- package/dist/tools/reconnect_to_tmux.d.ts.map +1 -1
- package/dist/tools/reconnect_to_tmux.js +44 -37
- package/dist/tools/reconnect_to_tmux.js.map +1 -1
- package/dist/tools/send_input.d.ts +3 -3
- package/dist/tools/send_input.d.ts.map +1 -1
- package/dist/tools/send_input.js +18 -18
- package/dist/tools/send_input.js.map +1 -1
- package/dist/tools/sftp_download.d.ts +3 -3
- package/dist/tools/sftp_download.d.ts.map +1 -1
- package/dist/tools/sftp_download.js +41 -27
- package/dist/tools/sftp_download.js.map +1 -1
- package/dist/tools/sftp_list.d.ts +3 -3
- package/dist/tools/sftp_list.d.ts.map +1 -1
- package/dist/tools/sftp_list.js +35 -26
- package/dist/tools/sftp_list.js.map +1 -1
- package/dist/tools/sftp_upload.d.ts +3 -3
- package/dist/tools/sftp_upload.d.ts.map +1 -1
- package/dist/tools/sftp_upload.js +43 -29
- package/dist/tools/sftp_upload.js.map +1 -1
- package/dist/tools/ssh_tunnel.d.ts +3 -3
- package/dist/tools/ssh_tunnel.d.ts.map +1 -1
- package/dist/tools/ssh_tunnel.js +130 -76
- package/dist/tools/ssh_tunnel.js.map +1 -1
- package/dist/tools/sync.d.ts +3 -3
- package/dist/tools/sync.d.ts.map +1 -1
- package/dist/tools/sync.js +103 -61
- package/dist/tools/sync.js.map +1 -1
- package/dist/tools/tail_log.d.ts +3 -3
- package/dist/tools/tail_log.d.ts.map +1 -1
- package/dist/tools/tail_log.js +38 -26
- package/dist/tools/tail_log.js.map +1 -1
- package/dist/tools/tools_config.d.ts +1 -1
- package/dist/tools/tools_config.d.ts.map +1 -1
- package/dist/tools/tools_config.js +25 -35
- package/dist/tools/tools_config.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/ansi.js +1 -1
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/logger.d.ts +1 -1
- package/dist/utils/logger.js +2 -2
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/security.d.ts +1 -1
- package/dist/utils/security.js +3 -3
- package/dist/utils/security.js.map +1 -1
- package/dist/utils/ssh.d.ts +2 -2
- package/dist/utils/ssh.js +5 -5
- package/dist/utils/ssh.js.map +1 -1
- package/dist/utils/sshConfig.d.ts +1 -1
- package/dist/utils/sshConfig.d.ts.map +1 -1
- package/dist/utils/sshConfig.js +21 -21
- package/dist/utils/sshConfig.js.map +1 -1
- package/dist/utils/validation.d.ts +1 -1
- package/dist/utils/validation.js +3 -3
- package/dist/utils/validation.js.map +1 -1
- package/docs/SECURITY.md +213 -213
- package/docs/TOOLS.md +425 -425
- package/package.json +59 -48
- package/vitest.config.ts +10 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list_hosts.js","sourceRoot":"","sources":["../../src/tools/list_hosts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,CAAC,MAAM,aAAa,GAAG;
|
|
1
|
+
{"version":3,"file":"list_hosts.js","sourceRoot":"","sources":["../../src/tools/list_hosts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB,IAAI,EAAE,YAAY;IAClB,WAAW,EACP,+GAA+G;IACnH,WAAW,EAAE;QACT,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE,EAAE;KACjB;CACJ,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,eAAe;IACjC,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,OAAO;QACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KACjF,CAAC;AACN,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export const listSessionsTool = {
|
|
2
|
-
name:
|
|
3
|
-
description:
|
|
2
|
+
name: "list_sessions",
|
|
3
|
+
description: "List all active MCP SSH sessions with their host, connection time, last activity, and tmux session name",
|
|
4
4
|
inputSchema: {
|
|
5
|
-
type:
|
|
5
|
+
type: "object",
|
|
6
6
|
properties: {},
|
|
7
7
|
},
|
|
8
8
|
};
|
|
@@ -11,7 +11,7 @@ export async function handleListSessions(sessionManager) {
|
|
|
11
11
|
return {
|
|
12
12
|
content: [
|
|
13
13
|
{
|
|
14
|
-
type:
|
|
14
|
+
type: "text",
|
|
15
15
|
text: JSON.stringify({ sessions }, null, 2),
|
|
16
16
|
},
|
|
17
17
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list_sessions.js","sourceRoot":"","sources":["../../src/tools/list_sessions.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAG;
|
|
1
|
+
{"version":3,"file":"list_sessions.js","sourceRoot":"","sources":["../../src/tools/list_sessions.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC5B,IAAI,EAAE,eAAe;IACrB,WAAW,EACP,yGAAyG;IAC7G,WAAW,EAAE;QACT,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE,EAAE;KACjB;CACJ,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,cAA8B;IACnE,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;IACvC,OAAO;QACH,OAAO,EAAE;YACL;gBACI,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;aAC9C;SACJ;KACJ,CAAC;AACN,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
import { SessionManager } from
|
|
3
|
-
import { TmuxManager } from
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { SessionManager } from "../core/SessionManager.js";
|
|
3
|
+
import { TmuxManager } from "../core/TmuxManager.js";
|
|
4
4
|
export declare const readOutputSchema: z.ZodObject<{
|
|
5
5
|
session_id: z.ZodString;
|
|
6
6
|
lines: z.ZodDefault<z.ZodNumber>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read_output.d.ts","sourceRoot":"","sources":["../../src/tools/read_output.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;AAIrD,eAAO,MAAM,gBAAgB;;;;;;;;;EAG3B,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"read_output.d.ts","sourceRoot":"","sources":["../../src/tools/read_output.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;AAIrD,eAAO,MAAM,gBAAgB;;;;;;;;;EAG3B,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;CAkB1B,CAAC;AAEF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW;;;;;;;;;;;;GA+C7G"}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
import { logger } from
|
|
3
|
-
import { stripAnsi } from
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { logger } from "../utils/logger.js";
|
|
3
|
+
import { stripAnsi } from "../utils/ansi.js";
|
|
4
4
|
export const readOutputSchema = z.object({
|
|
5
5
|
session_id: z.string().min(1),
|
|
6
6
|
lines: z.number().min(1).max(10000).default(200),
|
|
7
7
|
});
|
|
8
8
|
export const readOutputTool = {
|
|
9
|
-
name:
|
|
10
|
-
description:
|
|
9
|
+
name: "read_output",
|
|
10
|
+
description: "Capture the latest output from a tmux session pane. Returns recent terminal contents.",
|
|
11
11
|
inputSchema: {
|
|
12
|
-
type:
|
|
12
|
+
type: "object",
|
|
13
13
|
properties: {
|
|
14
14
|
session_id: {
|
|
15
|
-
type:
|
|
16
|
-
description:
|
|
15
|
+
type: "string",
|
|
16
|
+
description: "Session ID returned by connect",
|
|
17
17
|
},
|
|
18
18
|
lines: {
|
|
19
|
-
type:
|
|
20
|
-
description:
|
|
19
|
+
type: "number",
|
|
20
|
+
description: "Number of lines to capture from the end (default: 200, max: 10000)",
|
|
21
21
|
default: 200,
|
|
22
22
|
},
|
|
23
23
|
},
|
|
24
|
-
required: [
|
|
24
|
+
required: ["session_id"],
|
|
25
25
|
},
|
|
26
26
|
};
|
|
27
27
|
export async function handleReadOutput(args, sessionManager, tmuxManager) {
|
|
@@ -30,7 +30,7 @@ export async function handleReadOutput(args, sessionManager, tmuxManager) {
|
|
|
30
30
|
return {
|
|
31
31
|
content: [
|
|
32
32
|
{
|
|
33
|
-
type:
|
|
33
|
+
type: "text",
|
|
34
34
|
text: `Invalid arguments: ${parsed.error.message}`,
|
|
35
35
|
},
|
|
36
36
|
],
|
|
@@ -43,7 +43,7 @@ export async function handleReadOutput(args, sessionManager, tmuxManager) {
|
|
|
43
43
|
return {
|
|
44
44
|
content: [
|
|
45
45
|
{
|
|
46
|
-
type:
|
|
46
|
+
type: "text",
|
|
47
47
|
text: `Error: Session '${session_id}' not found or has been disconnected`,
|
|
48
48
|
},
|
|
49
49
|
],
|
|
@@ -52,17 +52,17 @@ export async function handleReadOutput(args, sessionManager, tmuxManager) {
|
|
|
52
52
|
}
|
|
53
53
|
try {
|
|
54
54
|
const output = await tmuxManager.capturePane(session.ssh, session.tmuxSession, lines);
|
|
55
|
-
logger.info({ sessionId: session_id, lines, outputLength: output.length },
|
|
55
|
+
logger.info({ sessionId: session_id, lines, outputLength: output.length }, "Output captured");
|
|
56
56
|
return {
|
|
57
|
-
content: [{ type:
|
|
57
|
+
content: [{ type: "text", text: stripAnsi(output) }],
|
|
58
58
|
};
|
|
59
59
|
}
|
|
60
60
|
catch (err) {
|
|
61
|
-
logger.error({ sessionId: session_id, error: err.message },
|
|
61
|
+
logger.error({ sessionId: session_id, error: err.message }, "Failed to read output");
|
|
62
62
|
return {
|
|
63
63
|
content: [
|
|
64
64
|
{
|
|
65
|
-
type:
|
|
65
|
+
type: "text",
|
|
66
66
|
text: `Error: Failed to read output: ${err.message}`,
|
|
67
67
|
},
|
|
68
68
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read_output.js","sourceRoot":"","sources":["../../src/tools/read_output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"read_output.js","sourceRoot":"","sources":["../../src/tools/read_output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;CACnD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC1B,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,uFAAuF;IACpG,WAAW,EAAE;QACT,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACR,UAAU,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gCAAgC;aAChD;YACD,KAAK,EAAE;gBACH,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oEAAoE;gBACjF,OAAO,EAAE,GAAG;aACf;SACJ;QACD,QAAQ,EAAE,CAAC,YAAY,CAAC;KAC3B;CACJ,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAa,EAAE,cAA8B,EAAE,WAAwB;IAC1G,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO;YACH,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,sBAAsB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;iBACrD;aACJ;YACD,OAAO,EAAE,IAAI;SAChB,CAAC;IACN,CAAC;IAED,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAC1C,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAE/C,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO;YACH,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,mBAAmB,UAAU,sCAAsC;iBAC5E;aACJ;YACD,OAAO,EAAE,IAAI;SAChB,CAAC;IACN,CAAC;IAED,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACtF,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC;QAC9F,OAAO;YACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;SAChE,CAAC;IACN,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,EAAE,uBAAuB,CAAC,CAAC;QAChG,OAAO;YACH,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,iCAAkC,GAAa,CAAC,OAAO,EAAE;iBAClE;aACJ;YACD,OAAO,EAAE,IAAI;SAChB,CAAC;IACN,CAAC;AACL,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
import { SessionManager } from
|
|
3
|
-
import { SSHManager } from
|
|
4
|
-
import { TmuxManager } from
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { SessionManager } from "../core/SessionManager.js";
|
|
3
|
+
import { SSHManager } from "../core/SSHManager.js";
|
|
4
|
+
import { TmuxManager } from "../core/TmuxManager.js";
|
|
5
5
|
export declare const reconnectSchema: z.ZodObject<{
|
|
6
6
|
host: z.ZodString;
|
|
7
7
|
tmux_session: z.ZodString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconnect_to_tmux.d.ts","sourceRoot":"","sources":["../../src/tools/reconnect_to_tmux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAc,MAAM,wBAAwB,CAAC;AAOjE,eAAO,MAAM,eAAe;;;;;;;;;;;;EAI1B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;CAsBzB,CAAC;AAEF,wBAAsB,eAAe,
|
|
1
|
+
{"version":3,"file":"reconnect_to_tmux.d.ts","sourceRoot":"","sources":["../../src/tools/reconnect_to_tmux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAc,MAAM,wBAAwB,CAAC;AAOjE,eAAO,MAAM,eAAe;;;;;;;;;;;;EAI1B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;CAsBzB,CAAC;AAEF,wBAAsB,eAAe,CACjC,IAAI,EAAE,OAAO,EACb,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,WAAW;;;;;;;;;;;;GAyL3B"}
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
import { MCP_PROMPT } from
|
|
3
|
-
import { listHostAliases, getHostConfig } from
|
|
4
|
-
import { buildSshConfig } from
|
|
5
|
-
import { isHostAllowed } from
|
|
6
|
-
import { logger } from
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { MCP_PROMPT } from "../core/TmuxManager.js";
|
|
3
|
+
import { listHostAliases, getHostConfig } from "../utils/sshConfig.js";
|
|
4
|
+
import { buildSshConfig } from "../utils/ssh.js";
|
|
5
|
+
import { isHostAllowed } from "../utils/security.js";
|
|
6
|
+
import { logger } from "../utils/logger.js";
|
|
7
7
|
export const reconnectSchema = z.object({
|
|
8
|
-
host: z.string().min(1).describe(
|
|
9
|
-
tmux_session: z.string().min(1).describe(
|
|
10
|
-
proxy_jump: z.string().min(1).optional().describe(
|
|
8
|
+
host: z.string().min(1).describe("SSH host alias from ~/.ssh/config"),
|
|
9
|
+
tmux_session: z.string().min(1).describe("Name of the existing tmux session on the remote host"),
|
|
10
|
+
proxy_jump: z.string().min(1).optional().describe("SSH host alias of the bastion/jump host"),
|
|
11
11
|
});
|
|
12
12
|
export const reconnectTool = {
|
|
13
|
-
name:
|
|
14
|
-
description:
|
|
13
|
+
name: "reconnect_to_tmux",
|
|
14
|
+
description: "Reconnect to an existing tmux session on a remote host. Useful for recovery after MCP restarts or SSH disconnections.",
|
|
15
15
|
inputSchema: {
|
|
16
|
-
type:
|
|
16
|
+
type: "object",
|
|
17
17
|
properties: {
|
|
18
18
|
host: {
|
|
19
|
-
type:
|
|
20
|
-
description:
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "SSH host alias from ~/.ssh/config",
|
|
21
21
|
},
|
|
22
22
|
tmux_session: {
|
|
23
|
-
type:
|
|
24
|
-
description:
|
|
23
|
+
type: "string",
|
|
24
|
+
description: "Name of the existing tmux session on the remote host",
|
|
25
25
|
},
|
|
26
26
|
proxy_jump: {
|
|
27
|
-
type:
|
|
28
|
-
description:
|
|
27
|
+
type: "string",
|
|
28
|
+
description: "Optional SSH host alias of a bastion/jump host",
|
|
29
29
|
},
|
|
30
30
|
},
|
|
31
|
-
required: [
|
|
31
|
+
required: ["host", "tmux_session"],
|
|
32
32
|
},
|
|
33
33
|
};
|
|
34
34
|
export async function handleReconnect(args, sessionManager, sshManager, tmuxManager) {
|
|
@@ -37,7 +37,7 @@ export async function handleReconnect(args, sessionManager, sshManager, tmuxMana
|
|
|
37
37
|
return {
|
|
38
38
|
content: [
|
|
39
39
|
{
|
|
40
|
-
type:
|
|
40
|
+
type: "text",
|
|
41
41
|
text: `Invalid arguments: ${parsed.error.message}`,
|
|
42
42
|
},
|
|
43
43
|
],
|
|
@@ -46,11 +46,11 @@ export async function handleReconnect(args, sessionManager, sshManager, tmuxMana
|
|
|
46
46
|
}
|
|
47
47
|
const { host, tmux_session } = parsed.data;
|
|
48
48
|
if (!isHostAllowed(host)) {
|
|
49
|
-
logger.warn({ host },
|
|
49
|
+
logger.warn({ host }, "Host rejected by allowlist");
|
|
50
50
|
return {
|
|
51
51
|
content: [
|
|
52
52
|
{
|
|
53
|
-
type:
|
|
53
|
+
type: "text",
|
|
54
54
|
text: `Error: Host '${host}' is not in the allowed hosts list`,
|
|
55
55
|
},
|
|
56
56
|
],
|
|
@@ -62,8 +62,8 @@ export async function handleReconnect(args, sessionManager, sshManager, tmuxMana
|
|
|
62
62
|
return {
|
|
63
63
|
content: [
|
|
64
64
|
{
|
|
65
|
-
type:
|
|
66
|
-
text: `Error: Host alias '${host}' not found in SSH config.\nAvailable aliases: ${aliases.join(
|
|
65
|
+
type: "text",
|
|
66
|
+
text: `Error: Host alias '${host}' not found in SSH config.\nAvailable aliases: ${aliases.join(", ") || "(none)"}`,
|
|
67
67
|
},
|
|
68
68
|
],
|
|
69
69
|
isError: true,
|
|
@@ -74,7 +74,7 @@ export async function handleReconnect(args, sessionManager, sshManager, tmuxMana
|
|
|
74
74
|
return {
|
|
75
75
|
content: [
|
|
76
76
|
{
|
|
77
|
-
type:
|
|
77
|
+
type: "text",
|
|
78
78
|
text: `Error: Failed to resolve SSH configuration for '${host}'`,
|
|
79
79
|
},
|
|
80
80
|
],
|
|
@@ -87,7 +87,7 @@ export async function handleReconnect(args, sessionManager, sshManager, tmuxMana
|
|
|
87
87
|
return {
|
|
88
88
|
content: [
|
|
89
89
|
{
|
|
90
|
-
type:
|
|
90
|
+
type: "text",
|
|
91
91
|
text: `Error: Failed to read SSH private key for '${host}'`,
|
|
92
92
|
},
|
|
93
93
|
],
|
|
@@ -99,21 +99,28 @@ export async function handleReconnect(args, sessionManager, sshManager, tmuxMana
|
|
|
99
99
|
if (proxyJumpAlias) {
|
|
100
100
|
if (!isHostAllowed(proxyJumpAlias)) {
|
|
101
101
|
return {
|
|
102
|
-
content: [{ type:
|
|
102
|
+
content: [{ type: "text", text: `Error: Proxy host '${proxyJumpAlias}' is not allowed` }],
|
|
103
103
|
isError: true,
|
|
104
104
|
};
|
|
105
105
|
}
|
|
106
106
|
const proxyConfig = getHostConfig(proxyJumpAlias);
|
|
107
107
|
if (!proxyConfig) {
|
|
108
108
|
return {
|
|
109
|
-
content: [
|
|
109
|
+
content: [
|
|
110
|
+
{
|
|
111
|
+
type: "text",
|
|
112
|
+
text: `Error: Failed to resolve SSH config for proxy '${proxyJumpAlias}'`,
|
|
113
|
+
},
|
|
114
|
+
],
|
|
110
115
|
isError: true,
|
|
111
116
|
};
|
|
112
117
|
}
|
|
113
118
|
const proxySshConfig = buildSshConfig(proxyConfig);
|
|
114
119
|
if (!proxySshConfig) {
|
|
115
120
|
return {
|
|
116
|
-
content: [
|
|
121
|
+
content: [
|
|
122
|
+
{ type: "text", text: `Error: Failed to read SSH key for proxy '${proxyJumpAlias}'` },
|
|
123
|
+
],
|
|
117
124
|
isError: true,
|
|
118
125
|
};
|
|
119
126
|
}
|
|
@@ -124,11 +131,11 @@ export async function handleReconnect(args, sessionManager, sshManager, tmuxMana
|
|
|
124
131
|
}
|
|
125
132
|
}
|
|
126
133
|
catch (err) {
|
|
127
|
-
logger.error({ host, proxyJump: proxyJumpAlias, error: err.message },
|
|
134
|
+
logger.error({ host, proxyJump: proxyJumpAlias, error: err.message }, "SSH connection failed");
|
|
128
135
|
return {
|
|
129
136
|
content: [
|
|
130
137
|
{
|
|
131
|
-
type:
|
|
138
|
+
type: "text",
|
|
132
139
|
text: `Error: SSH connection failed: ${err.message}`,
|
|
133
140
|
},
|
|
134
141
|
],
|
|
@@ -141,7 +148,7 @@ export async function handleReconnect(args, sessionManager, sshManager, tmuxMana
|
|
|
141
148
|
return {
|
|
142
149
|
content: [
|
|
143
150
|
{
|
|
144
|
-
type:
|
|
151
|
+
type: "text",
|
|
145
152
|
text: `Error: tmux is not installed on host '${host}'.`,
|
|
146
153
|
},
|
|
147
154
|
],
|
|
@@ -154,7 +161,7 @@ export async function handleReconnect(args, sessionManager, sshManager, tmuxMana
|
|
|
154
161
|
return {
|
|
155
162
|
content: [
|
|
156
163
|
{
|
|
157
|
-
type:
|
|
164
|
+
type: "text",
|
|
158
165
|
text: `Error: tmux session '${tmux_session}' does not exist on host '${host}'.`,
|
|
159
166
|
},
|
|
160
167
|
],
|
|
@@ -175,22 +182,22 @@ export async function handleReconnect(args, sessionManager, sshManager, tmuxMana
|
|
|
175
182
|
}
|
|
176
183
|
}
|
|
177
184
|
catch {
|
|
178
|
-
logger.warn({ host, tmux_session, attempt },
|
|
185
|
+
logger.warn({ host, tmux_session, attempt }, "Prompt injection retry");
|
|
179
186
|
}
|
|
180
187
|
}
|
|
181
188
|
if (!promptInjected) {
|
|
182
|
-
logger.warn({ host, tmux_session },
|
|
189
|
+
logger.warn({ host, tmux_session }, "Failed to inject prompt after retries, continuing");
|
|
183
190
|
}
|
|
184
191
|
const session = sessionManager.create(host, ssh, tmux_session);
|
|
185
192
|
return {
|
|
186
193
|
content: [
|
|
187
194
|
{
|
|
188
|
-
type:
|
|
195
|
+
type: "text",
|
|
189
196
|
text: JSON.stringify({
|
|
190
197
|
session_id: session.id,
|
|
191
198
|
host: session.host,
|
|
192
199
|
tmux_session: session.tmuxSession,
|
|
193
|
-
status:
|
|
200
|
+
status: "reconnected",
|
|
194
201
|
}, null, 2),
|
|
195
202
|
},
|
|
196
203
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconnect_to_tmux.js","sourceRoot":"","sources":["../../src/tools/reconnect_to_tmux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAe,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"reconnect_to_tmux.js","sourceRoot":"","sources":["../../src/tools/reconnect_to_tmux.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
import { SessionManager } from
|
|
3
|
-
import { TmuxManager } from
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { SessionManager } from "../core/SessionManager.js";
|
|
3
|
+
import { TmuxManager } from "../core/TmuxManager.js";
|
|
4
4
|
export declare const sendInputSchema: z.ZodObject<{
|
|
5
5
|
session_id: z.ZodString;
|
|
6
6
|
input: z.ZodString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send_input.d.ts","sourceRoot":"","sources":["../../src/tools/send_input.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;AAIrD,eAAO,MAAM,eAAe;;;;;;;;;EAG1B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;CAkBzB,CAAC;AAEF,wBAAsB,eAAe,
|
|
1
|
+
{"version":3,"file":"send_input.d.ts","sourceRoot":"","sources":["../../src/tools/send_input.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;AAIrD,eAAO,MAAM,eAAe;;;;;;;;;EAG1B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;CAkBzB,CAAC;AAEF,wBAAsB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW;;;;;;;;;;;;GA2D5G"}
|
package/dist/tools/send_input.js
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
import { isReadOnlyMode } from
|
|
3
|
-
import { logger } from
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { isReadOnlyMode } from "../utils/security.js";
|
|
3
|
+
import { logger } from "../utils/logger.js";
|
|
4
4
|
export const sendInputSchema = z.object({
|
|
5
5
|
session_id: z.string().min(1),
|
|
6
6
|
input: z.string(),
|
|
7
7
|
});
|
|
8
8
|
export const sendInputTool = {
|
|
9
|
-
name:
|
|
10
|
-
description:
|
|
9
|
+
name: "send_input",
|
|
10
|
+
description: "Send raw input into a persistent tmux session. Preserves shell state (cwd, env, history). Non-blocking.",
|
|
11
11
|
inputSchema: {
|
|
12
|
-
type:
|
|
12
|
+
type: "object",
|
|
13
13
|
properties: {
|
|
14
14
|
session_id: {
|
|
15
|
-
type:
|
|
16
|
-
description:
|
|
15
|
+
type: "string",
|
|
16
|
+
description: "Session ID returned by connect",
|
|
17
17
|
},
|
|
18
18
|
input: {
|
|
19
|
-
type:
|
|
20
|
-
description:
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "Raw input text to send to the tmux pane",
|
|
21
21
|
},
|
|
22
22
|
},
|
|
23
|
-
required: [
|
|
23
|
+
required: ["session_id", "input"],
|
|
24
24
|
},
|
|
25
25
|
};
|
|
26
26
|
export async function handleSendInput(args, sessionManager, tmuxManager) {
|
|
@@ -29,7 +29,7 @@ export async function handleSendInput(args, sessionManager, tmuxManager) {
|
|
|
29
29
|
return {
|
|
30
30
|
content: [
|
|
31
31
|
{
|
|
32
|
-
type:
|
|
32
|
+
type: "text",
|
|
33
33
|
text: `Invalid arguments: ${parsed.error.message}`,
|
|
34
34
|
},
|
|
35
35
|
],
|
|
@@ -42,7 +42,7 @@ export async function handleSendInput(args, sessionManager, tmuxManager) {
|
|
|
42
42
|
return {
|
|
43
43
|
content: [
|
|
44
44
|
{
|
|
45
|
-
type:
|
|
45
|
+
type: "text",
|
|
46
46
|
text: `Error: Session '${session_id}' not found or has been disconnected`,
|
|
47
47
|
},
|
|
48
48
|
],
|
|
@@ -53,7 +53,7 @@ export async function handleSendInput(args, sessionManager, tmuxManager) {
|
|
|
53
53
|
return {
|
|
54
54
|
content: [
|
|
55
55
|
{
|
|
56
|
-
type:
|
|
56
|
+
type: "text",
|
|
57
57
|
text: `Error: Host '${session.host}' is in read-only mode. Input sending is disabled.`,
|
|
58
58
|
},
|
|
59
59
|
],
|
|
@@ -62,17 +62,17 @@ export async function handleSendInput(args, sessionManager, tmuxManager) {
|
|
|
62
62
|
}
|
|
63
63
|
try {
|
|
64
64
|
await tmuxManager.sendInput(session.ssh, session.tmuxSession, input);
|
|
65
|
-
logger.info({ sessionId: session_id, inputLength: input.length },
|
|
65
|
+
logger.info({ sessionId: session_id, inputLength: input.length }, "Input sent");
|
|
66
66
|
return {
|
|
67
|
-
content: [{ type:
|
|
67
|
+
content: [{ type: "text", text: "Input sent successfully" }],
|
|
68
68
|
};
|
|
69
69
|
}
|
|
70
70
|
catch (err) {
|
|
71
|
-
logger.error({ sessionId: session_id, error: err.message },
|
|
71
|
+
logger.error({ sessionId: session_id, error: err.message }, "Failed to send input");
|
|
72
72
|
return {
|
|
73
73
|
content: [
|
|
74
74
|
{
|
|
75
|
-
type:
|
|
75
|
+
type: "text",
|
|
76
76
|
text: `Error: Failed to send input: ${err.message}`,
|
|
77
77
|
},
|
|
78
78
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send_input.js","sourceRoot":"","sources":["../../src/tools/send_input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"send_input.js","sourceRoot":"","sources":["../../src/tools/send_input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB,IAAI,EAAE,YAAY;IAClB,WAAW,EACP,yGAAyG;IAC7G,WAAW,EAAE;QACT,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACR,UAAU,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gCAAgC;aAChD;YACD,KAAK,EAAE;gBACH,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,yCAAyC;aACzD;SACJ;QACD,QAAQ,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC;KACpC;CACJ,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAa,EAAE,cAA8B,EAAE,WAAwB;IACzG,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO;YACH,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,sBAAsB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;iBACrD;aACJ;YACD,OAAO,EAAE,IAAI;SAChB,CAAC;IACN,CAAC;IAED,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAC1C,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAE/C,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO;YACH,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,mBAAmB,UAAU,sCAAsC;iBAC5E;aACJ;YACD,OAAO,EAAE,IAAI;SAChB,CAAC;IACN,CAAC;IAED,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO;YACH,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,gBAAgB,OAAO,CAAC,IAAI,oDAAoD;iBACzF;aACJ;YACD,OAAO,EAAE,IAAI;SAChB,CAAC;IACN,CAAC;IAED,IAAI,CAAC;QACD,MAAM,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC;QAChF,OAAO;YACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC;SACxE,CAAC;IACN,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,EAAE,sBAAsB,CAAC,CAAC;QAC/F,OAAO;YACH,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,gCAAiC,GAAa,CAAC,OAAO,EAAE;iBACjE;aACJ;YACD,OAAO,EAAE,IAAI;SAChB,CAAC;IACN,CAAC;AACL,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
import { SessionManager } from
|
|
3
|
-
import { SSHManager } from
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { SessionManager } from "../core/SessionManager.js";
|
|
3
|
+
import { SSHManager } from "../core/SSHManager.js";
|
|
4
4
|
export declare const sftpDownloadSchema: z.ZodObject<{
|
|
5
5
|
session_id: z.ZodString;
|
|
6
6
|
remote_path: z.ZodString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sftp_download.d.ts","sourceRoot":"","sources":["../../src/tools/sftp_download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAInD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"sftp_download.d.ts","sourceRoot":"","sources":["../../src/tools/sftp_download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAInD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;CAqB5B,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU;;;;;;;;;;;;GA+E7G"}
|