@wunderio/wdrmcp 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/env-resolve.d.ts +27 -0
- package/dist/env-resolve.d.ts.map +1 -0
- package/dist/env-resolve.js +61 -0
- package/dist/env-resolve.js.map +1 -0
- package/dist/executors/command.d.ts +10 -14
- package/dist/executors/command.d.ts.map +1 -1
- package/dist/executors/command.js +15 -30
- package/dist/executors/command.js.map +1 -1
- package/dist/executors/ssh.d.ts +28 -0
- package/dist/executors/ssh.d.ts.map +1 -0
- package/dist/executors/ssh.js +67 -0
- package/dist/executors/ssh.js.map +1 -0
- package/dist/logger.d.ts +2 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +13 -8
- package/dist/logger.js.map +1 -1
- package/dist/registry.d.ts +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +20 -8
- package/dist/registry.js.map +1 -1
- package/dist/types.d.ts +16 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAoB/C,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CA4CtD"}
|
package/dist/config.js
CHANGED
|
@@ -15,6 +15,7 @@ Environment variables:
|
|
|
15
15
|
DDEV_PROJECT DDEV project name (default: "default-project")
|
|
16
16
|
HOST_PROJECT_ROOT Host filesystem project root (default: /workspace)
|
|
17
17
|
CONTAINER_PROJECT_ROOT Container filesystem project root (default: /var/www/html)
|
|
18
|
+
SSH_USER SSH user for container connections (default: $USER)
|
|
18
19
|
`);
|
|
19
20
|
}
|
|
20
21
|
export function parseArgs(argv) {
|
|
@@ -54,6 +55,7 @@ export function parseArgs(argv) {
|
|
|
54
55
|
logFile,
|
|
55
56
|
hostProjectRoot: process.env.HOST_PROJECT_ROOT ?? "/workspace",
|
|
56
57
|
containerProjectRoot: process.env.CONTAINER_PROJECT_ROOT ?? "/var/www/html",
|
|
58
|
+
sshUser: process.env.SSH_USER ?? process.env.USER,
|
|
57
59
|
};
|
|
58
60
|
}
|
|
59
61
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,SAAS,UAAU;IACjB,OAAO,CAAC,KAAK,CAAC
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,SAAS,UAAU;IACjB,OAAO,CAAC,KAAK,CAAC;;;;;;;;;;;;;;CAcf,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,6BAA6B;IAEzD,IAAI,eAAmC,CAAC;IACxC,IAAI,QAAQ,GAA6B,MAAM,CAAC;IAChD,IAAI,OAAO,GAAuB,iBAAiB,CAAC;IAEpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,KAAK,gBAAgB;gBACnB,eAAe,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5B,MAAM;YACR,KAAK,aAAa;gBAChB,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAA6B,CAAC;gBACjD,MAAM;YACR,KAAK,YAAY;gBACf,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpB,MAAM;YACR,KAAK,QAAQ;gBACX,UAAU,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB;gBACE,OAAO,CAAC,KAAK,CAAC,qBAAqB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC9C,UAAU,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnD,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO;QACL,eAAe;QACf,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,iBAAiB;QAC1D,QAAQ;QACR,OAAO;QACP,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,YAAY;QAC9D,oBAAoB,EAClB,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,eAAe;QACvD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI;KAClD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment variable resolution utilities.
|
|
3
|
+
*
|
|
4
|
+
* Supports two placeholder syntaxes:
|
|
5
|
+
* - {VAR} - simple placeholder (legacy)
|
|
6
|
+
* - ${VAR} - environment variable (new)
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Resolve environment variables and placeholders in a template string.
|
|
10
|
+
*
|
|
11
|
+
* Supports:
|
|
12
|
+
* - {DDEV_PROJECT} → from BridgeConfig or env
|
|
13
|
+
* - ${DDEV_SSH_USER} → from process.env
|
|
14
|
+
* - ${HOME} → from process.env
|
|
15
|
+
*
|
|
16
|
+
* @param template The template string to resolve
|
|
17
|
+
* @param envVars Optional custom environment variables (defaults to process.env)
|
|
18
|
+
* @param bridgeVars Optional bridge-specific variables like ddevProject
|
|
19
|
+
* @returns Resolved string
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveEnvVars(template: string, envVars?: Record<string, string | undefined>, bridgeVars?: Record<string, string>): string;
|
|
22
|
+
/**
|
|
23
|
+
* Resolve environment variables in an object recursively.
|
|
24
|
+
* Strings are resolved for placeholders, other types are returned as-is.
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolveEnvVarsInObject(obj: Record<string, unknown>, envVars?: Record<string, string | undefined>, bridgeVars?: Record<string, string>): Record<string, unknown>;
|
|
27
|
+
//# sourceMappingURL=env-resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-resolve.d.ts","sourceRoot":"","sources":["../src/env-resolve.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAyC,EACnF,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACtC,MAAM,CAyBR;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAC5C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAYzB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment variable resolution utilities.
|
|
3
|
+
*
|
|
4
|
+
* Supports two placeholder syntaxes:
|
|
5
|
+
* - {VAR} - simple placeholder (legacy)
|
|
6
|
+
* - ${VAR} - environment variable (new)
|
|
7
|
+
*/
|
|
8
|
+
import { getLogger } from "./logger.js";
|
|
9
|
+
/**
|
|
10
|
+
* Resolve environment variables and placeholders in a template string.
|
|
11
|
+
*
|
|
12
|
+
* Supports:
|
|
13
|
+
* - {DDEV_PROJECT} → from BridgeConfig or env
|
|
14
|
+
* - ${DDEV_SSH_USER} → from process.env
|
|
15
|
+
* - ${HOME} → from process.env
|
|
16
|
+
*
|
|
17
|
+
* @param template The template string to resolve
|
|
18
|
+
* @param envVars Optional custom environment variables (defaults to process.env)
|
|
19
|
+
* @param bridgeVars Optional bridge-specific variables like ddevProject
|
|
20
|
+
* @returns Resolved string
|
|
21
|
+
*/
|
|
22
|
+
export function resolveEnvVars(template, envVars = process.env, bridgeVars = {}) {
|
|
23
|
+
const log = getLogger();
|
|
24
|
+
let result = template;
|
|
25
|
+
// Resolve ${VAR} syntax first (environment variables)
|
|
26
|
+
result = result.replace(/\$\{(\w+)\}/g, (match, varName) => {
|
|
27
|
+
const value = envVars[varName];
|
|
28
|
+
if (!value) {
|
|
29
|
+
log.warn(`Environment variable not found: ${varName}, keeping placeholder`);
|
|
30
|
+
return match;
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
});
|
|
34
|
+
// Resolve {VAR} syntax (bridge-specific variables)
|
|
35
|
+
result = result.replace(/\{(\w+)\}/g, (match, varName) => {
|
|
36
|
+
const value = bridgeVars[varName];
|
|
37
|
+
if (!value) {
|
|
38
|
+
log.warn(`Bridge variable not found: ${varName}, keeping placeholder`);
|
|
39
|
+
return match;
|
|
40
|
+
}
|
|
41
|
+
return value;
|
|
42
|
+
});
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Resolve environment variables in an object recursively.
|
|
47
|
+
* Strings are resolved for placeholders, other types are returned as-is.
|
|
48
|
+
*/
|
|
49
|
+
export function resolveEnvVarsInObject(obj, envVars, bridgeVars) {
|
|
50
|
+
const result = {};
|
|
51
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
52
|
+
if (typeof value === "string") {
|
|
53
|
+
result[key] = resolveEnvVars(value, envVars, bridgeVars);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
result[key] = value;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=env-resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-resolve.js","sourceRoot":"","sources":["../src/env-resolve.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAgB,EAChB,UAA8C,OAAO,CAAC,GAA6B,EACnF,aAAqC,EAAE;IAEvC,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,IAAI,MAAM,GAAG,QAAQ,CAAC;IAEtB,sDAAsD;IACtD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACzD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,GAAG,CAAC,IAAI,CAAC,mCAAmC,OAAO,uBAAuB,CAAC,CAAC;YAC5E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,mDAAmD;IACnD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACvD,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,GAAG,CAAC,IAAI,CAAC,8BAA8B,OAAO,uBAAuB,CAAC,CAAC;YACvE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAA4B,EAC5B,OAA4C,EAC5C,UAAmC;IAEnC,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,30 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CommandToolExecutor — executes shell commands
|
|
2
|
+
* CommandToolExecutor — executes shell commands via SSH
|
|
3
3
|
* with argument substitution ({placeholder} syntax).
|
|
4
|
-
*
|
|
5
|
-
* Refactored from the Python version with these improvements:
|
|
6
|
-
* - Static safety checks happen at construction time (not per-call)
|
|
7
|
-
* - Container validation and UID resolution are cached in docker.ts
|
|
8
|
-
* - Path normalization is an external preprocessor (not baked in)
|
|
9
|
-
* - No abstract base class; implements ToolExecutor interface directly
|
|
10
4
|
*/
|
|
11
|
-
import type { ToolExecutionResult, ToolExecutor, ValidationRule } from "../types.js";
|
|
5
|
+
import type { ToolExecutionResult, ToolExecutor, ValidationRule, ContainerExecutor } from "../types.js";
|
|
12
6
|
export interface CommandExecutorOptions {
|
|
13
7
|
commandTemplate: string;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
host: string;
|
|
9
|
+
executor: ContainerExecutor;
|
|
10
|
+
sshUser?: string;
|
|
17
11
|
shell?: string;
|
|
12
|
+
workingDir?: string;
|
|
18
13
|
defaultArgs?: Record<string, string>;
|
|
19
14
|
disallowedCommands?: string[];
|
|
20
15
|
validationRules?: ValidationRule[];
|
|
21
16
|
}
|
|
22
17
|
export declare class CommandToolExecutor implements ToolExecutor {
|
|
23
18
|
private readonly commandTemplate;
|
|
24
|
-
private readonly
|
|
25
|
-
private readonly
|
|
26
|
-
private readonly
|
|
19
|
+
private readonly host;
|
|
20
|
+
private readonly executor;
|
|
21
|
+
private readonly sshUser?;
|
|
27
22
|
private readonly shell;
|
|
23
|
+
private readonly workingDir?;
|
|
28
24
|
private readonly defaultArgs;
|
|
29
25
|
private readonly disallowedCommands;
|
|
30
26
|
private readonly validationRules;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/executors/command.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/executors/command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAExG,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;CACpC;AAED,qBAAa,mBAAoB,YAAW,YAAY;IACtD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;IACrD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAc;IACjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmB;gBAEvC,OAAO,EAAE,sBAAsB;IAYrC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA6C1E,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAiBtD,6EAA6E;IAC7E,OAAO,CAAC,UAAU;CAQnB"}
|
|
@@ -1,40 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CommandToolExecutor — executes shell commands
|
|
2
|
+
* CommandToolExecutor — executes shell commands via SSH
|
|
3
3
|
* with argument substitution ({placeholder} syntax).
|
|
4
|
-
*
|
|
5
|
-
* Refactored from the Python version with these improvements:
|
|
6
|
-
* - Static safety checks happen at construction time (not per-call)
|
|
7
|
-
* - Container validation and UID resolution are cached in docker.ts
|
|
8
|
-
* - Path normalization is an external preprocessor (not baked in)
|
|
9
|
-
* - No abstract base class; implements ToolExecutor interface directly
|
|
10
4
|
*/
|
|
11
|
-
import { dockerExec, validateContainer, validateStaticSafety, resolveContainerUser, } from "../docker.js";
|
|
12
5
|
import { getLogger } from "../logger.js";
|
|
13
6
|
export class CommandToolExecutor {
|
|
14
7
|
commandTemplate;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
8
|
+
host;
|
|
9
|
+
executor;
|
|
10
|
+
sshUser;
|
|
18
11
|
shell;
|
|
12
|
+
workingDir;
|
|
19
13
|
defaultArgs;
|
|
20
14
|
disallowedCommands;
|
|
21
15
|
validationRules;
|
|
22
16
|
constructor(options) {
|
|
23
17
|
this.commandTemplate = options.commandTemplate;
|
|
24
|
-
this.
|
|
25
|
-
this.
|
|
26
|
-
this.
|
|
18
|
+
this.host = options.host;
|
|
19
|
+
this.executor = options.executor;
|
|
20
|
+
this.sshUser = options.sshUser;
|
|
27
21
|
this.shell = options.shell ?? "/bin/bash";
|
|
22
|
+
this.workingDir = options.workingDir;
|
|
28
23
|
this.defaultArgs = options.defaultArgs ?? {};
|
|
29
24
|
this.disallowedCommands = new Set(options.disallowedCommands ?? []);
|
|
30
25
|
this.validationRules = options.validationRules ?? [];
|
|
31
|
-
// Static safety: validate shell and flag at construction, not per-call.
|
|
32
|
-
validateStaticSafety([this.shell, "-c"]);
|
|
33
26
|
}
|
|
34
27
|
async execute(args) {
|
|
35
28
|
const log = getLogger();
|
|
36
|
-
// Resolve user (cached after first call).
|
|
37
|
-
const user = await resolveContainerUser(this.user, this.container);
|
|
38
29
|
// Merge with defaults.
|
|
39
30
|
const mergedArgs = { ...this.defaultArgs, ...args };
|
|
40
31
|
// Check disallowed commands.
|
|
@@ -59,21 +50,15 @@ export class CommandToolExecutor {
|
|
|
59
50
|
if (ruleError) {
|
|
60
51
|
return { content: `Validation error: ${ruleError}`, isError: true };
|
|
61
52
|
}
|
|
62
|
-
//
|
|
53
|
+
// Execute via injected executor (SSH or other).
|
|
63
54
|
try {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
log.warn(`Container validation: ${e.message}`);
|
|
68
|
-
}
|
|
69
|
-
// Execute in Docker container.
|
|
70
|
-
try {
|
|
71
|
-
log.info(`EXEC: ${this.container} as ${user}: ${this.shell} -c ...`);
|
|
72
|
-
const output = await dockerExec({
|
|
73
|
-
container: this.container,
|
|
55
|
+
log.info(`EXEC: ${this.host} via ${this.executor.constructor.name}`);
|
|
56
|
+
const output = await this.executor.execute({
|
|
57
|
+
host: this.host,
|
|
74
58
|
command: [cmdStr],
|
|
75
|
-
user,
|
|
59
|
+
user: this.sshUser,
|
|
76
60
|
shell: this.shell,
|
|
61
|
+
workingDir: this.workingDir,
|
|
77
62
|
});
|
|
78
63
|
return { content: output.trim() };
|
|
79
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/executors/command.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/executors/command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ContainerExecutor } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Executes commands on SSH hosts.
|
|
4
|
+
* Assumes SSH keys are configured and available (e.g. via homeadditions).
|
|
5
|
+
*/
|
|
6
|
+
export declare class SshExecutor implements ContainerExecutor {
|
|
7
|
+
private readonly defaultUser;
|
|
8
|
+
constructor(defaultUser?: string);
|
|
9
|
+
execute(options: {
|
|
10
|
+
host: string;
|
|
11
|
+
command: string[];
|
|
12
|
+
user?: string;
|
|
13
|
+
shell?: string;
|
|
14
|
+
workingDir?: string;
|
|
15
|
+
}): Promise<string>;
|
|
16
|
+
/**
|
|
17
|
+
* Resolve the SSH user to connect as.
|
|
18
|
+
* - If user is a simple string (username), use it
|
|
19
|
+
* - Otherwise use configured default or $USER env var
|
|
20
|
+
*/
|
|
21
|
+
private resolveSshUser;
|
|
22
|
+
/**
|
|
23
|
+
* Escape a shell command for safe execution via SSH.
|
|
24
|
+
* Wraps the entire command in single quotes and escapes any embedded single quotes.
|
|
25
|
+
*/
|
|
26
|
+
private escapeShellCommand;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=ssh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/executors/ssh.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;GAGG;AACH,qBAAa,WAAY,YAAW,iBAAiB;IACnD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;gBAErC,WAAW,CAAC,EAAE,MAAM;IAI1B,OAAO,CAAC,OAAO,EAAE;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,MAAM,CAAC;IAoDnB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAOtB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;CAK3B"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { getLogger } from "../logger.js";
|
|
3
|
+
/**
|
|
4
|
+
* Executes commands on SSH hosts.
|
|
5
|
+
* Assumes SSH keys are configured and available (e.g. via homeadditions).
|
|
6
|
+
*/
|
|
7
|
+
export class SshExecutor {
|
|
8
|
+
defaultUser;
|
|
9
|
+
constructor(defaultUser) {
|
|
10
|
+
this.defaultUser = defaultUser ?? process.env.USER;
|
|
11
|
+
}
|
|
12
|
+
async execute(options) {
|
|
13
|
+
const { host, command, user, shell = "/bin/bash", workingDir } = options;
|
|
14
|
+
const log = getLogger();
|
|
15
|
+
// Determine the SSH user to connect as
|
|
16
|
+
const sshUser = this.resolveSshUser(user);
|
|
17
|
+
// Escape the command for safe shell execution
|
|
18
|
+
const escapedCmd = this.escapeShellCommand(command.join(" "));
|
|
19
|
+
// Build the full command, optionally with working directory change
|
|
20
|
+
let remoteCmd = escapedCmd;
|
|
21
|
+
if (workingDir) {
|
|
22
|
+
const escapedDir = this.escapeShellCommand(workingDir);
|
|
23
|
+
remoteCmd = `cd ${escapedDir} && ${escapedCmd}`;
|
|
24
|
+
}
|
|
25
|
+
const fullCmd = `${shell} -c ${remoteCmd}`;
|
|
26
|
+
// Build SSH destination: "user@hostname" or just "hostname"
|
|
27
|
+
const sshDestination = sshUser ? `${sshUser}@${host}` : host;
|
|
28
|
+
const sshArgs = [
|
|
29
|
+
"-o", "StrictHostKeyChecking=no",
|
|
30
|
+
"-o", "UserKnownHostsFile=/dev/null",
|
|
31
|
+
"-o", "LogLevel=ERROR",
|
|
32
|
+
sshDestination,
|
|
33
|
+
fullCmd
|
|
34
|
+
];
|
|
35
|
+
log.debug(`SSH Exec: ssh ${sshArgs.join(" ")}`);
|
|
36
|
+
return new Promise((resolve, reject) => {
|
|
37
|
+
execFile("ssh", sshArgs, { maxBuffer: 10 * 1024 * 1024, timeout: 120_000 }, (error, stdout, stderr) => {
|
|
38
|
+
if (error) {
|
|
39
|
+
reject(new Error(`SSH command failed: ssh ${sshDestination} ${fullCmd}\n${stderr?.trim() || error.message}`));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
resolve(stdout);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resolve the SSH user to connect as.
|
|
48
|
+
* - If user is a simple string (username), use it
|
|
49
|
+
* - Otherwise use configured default or $USER env var
|
|
50
|
+
*/
|
|
51
|
+
resolveSshUser(user) {
|
|
52
|
+
if (user) {
|
|
53
|
+
return user;
|
|
54
|
+
}
|
|
55
|
+
return this.defaultUser;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Escape a shell command for safe execution via SSH.
|
|
59
|
+
* Wraps the entire command in single quotes and escapes any embedded single quotes.
|
|
60
|
+
*/
|
|
61
|
+
escapeShellCommand(cmd) {
|
|
62
|
+
// Escape single quotes by replacing ' with '\''
|
|
63
|
+
const escaped = cmd.replace(/'/g, "'\\''");
|
|
64
|
+
return `'${escaped}'`;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=ssh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/executors/ssh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC;;;GAGG;AACH,MAAM,OAAO,WAAW;IACL,WAAW,CAAqB;IAEjD,YAAY,WAAoB;QAC9B,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAMb;QACC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,GAAG,WAAW,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QACzE,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QAExB,uCAAuC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAE1C,8CAA8C;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAE9D,mEAAmE;QACnE,IAAI,SAAS,GAAG,UAAU,CAAC;QAC3B,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YACvD,SAAS,GAAG,MAAM,UAAU,OAAO,UAAU,EAAE,CAAC;QAClD,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,KAAK,OAAO,SAAS,EAAE,CAAC;QAE3C,4DAA4D;QAC5D,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAE7D,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,0BAA0B;YAChC,IAAI,EAAE,8BAA8B;YACpC,IAAI,EAAE,gBAAgB;YACtB,cAAc;YACd,OAAO;SACR,CAAC;QAEF,GAAG,CAAC,KAAK,CAAC,iBAAiB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,QAAQ,CACN,KAAK,EACL,OAAO,EACP,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EACjD,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBACxB,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,CACJ,IAAI,KAAK,CACP,2BAA2B,cAAc,IAAI,OAAO,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,KAAK,CAAC,OAAO,EAAE,CAC3F,CACF,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACK,cAAc,CAAC,IAAwB;QAC7C,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACK,kBAAkB,CAAC,GAAW;QACpC,gDAAgD;QAChD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3C,OAAO,IAAI,OAAO,GAAG,CAAC;IACxB,CAAC;CACF"}
|
package/dist/logger.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Logger for MCP servers (stdout is reserved for JSON-RPC).
|
|
3
|
-
* Writes WARN
|
|
3
|
+
* Writes WARN/ERROR to stderr, all levels to log file if configured.
|
|
4
4
|
*/
|
|
5
5
|
export type LogLevel = "debug" | "info" | "warn" | "error";
|
|
6
6
|
export declare class Logger {
|
|
7
7
|
private level;
|
|
8
8
|
private logFile?;
|
|
9
9
|
constructor(level?: LogLevel, logFile?: string);
|
|
10
|
+
private formatArgs;
|
|
10
11
|
private log;
|
|
11
12
|
debug(message: string, ...args: unknown[]): void;
|
|
12
13
|
info(message: string, ...args: unknown[]): void;
|
package/dist/logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAS3D,qBAAa,MAAM;
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAS3D,qBAAa,MAAM;IACf,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAC,CAAS;gBAEb,KAAK,GAAE,QAAiB,EAAE,OAAO,CAAC,EAAE,MAAM;IActD,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,GAAG;IAyBX,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAIhD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAI/C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAI/C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;CAGnD;AAKD,wBAAgB,UAAU,CAAC,KAAK,GAAE,QAAiB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAG7E;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC"}
|
package/dist/logger.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Logger for MCP servers (stdout is reserved for JSON-RPC).
|
|
3
|
-
* Writes WARN
|
|
3
|
+
* Writes WARN/ERROR to stderr, all levels to log file if configured.
|
|
4
4
|
*/
|
|
5
5
|
import { appendFileSync, writeFileSync } from "node:fs";
|
|
6
6
|
const LOG_LEVELS = {
|
|
@@ -25,22 +25,27 @@ export class Logger {
|
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
+
formatArgs(args) {
|
|
29
|
+
if (args.length === 0)
|
|
30
|
+
return "";
|
|
31
|
+
return ` ${args.map((arg) => (typeof arg === "string" ? arg : JSON.stringify(arg))).join(" ")}`;
|
|
32
|
+
}
|
|
28
33
|
log(level, message, ...args) {
|
|
29
34
|
if (LOG_LEVELS[level] < this.level)
|
|
30
35
|
return;
|
|
31
36
|
const timestamp = new Date().toISOString();
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
37
|
+
const levelLabel = level.toUpperCase();
|
|
38
|
+
const argsText = this.formatArgs(args);
|
|
39
|
+
const fileFormatted = `${timestamp} - wdrmcp - ${levelLabel} - ${message}${argsText}`;
|
|
40
|
+
const stderrFormatted = `[wdrmcp] ${level}: ${message}${argsText}`;
|
|
41
|
+
// Write WARN/ERROR to stderr for VSCode logs; keep INFO/DEBUG in file only.
|
|
35
42
|
if (level === "warn" || level === "error") {
|
|
36
|
-
console.error(
|
|
43
|
+
console.error(stderrFormatted);
|
|
37
44
|
}
|
|
38
45
|
// Optionally write to file.
|
|
39
46
|
if (this.logFile) {
|
|
40
47
|
try {
|
|
41
|
-
const fileMsg =
|
|
42
|
-
? `${formatted} ${args.map((a) => (typeof a === "string" ? a : JSON.stringify(a))).join(" ")}\n`
|
|
43
|
-
: `${formatted}\n`;
|
|
48
|
+
const fileMsg = `${fileFormatted}\n`;
|
|
44
49
|
appendFileSync(this.logFile, fileMsg);
|
|
45
50
|
}
|
|
46
51
|
catch {
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAIxD,MAAM,UAAU,GAA6B;
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
package/dist/registry.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export declare class ToolRegistry {
|
|
|
13
13
|
private readonly config;
|
|
14
14
|
private readonly tools;
|
|
15
15
|
private readonly argPreprocessor;
|
|
16
|
+
private readonly containerExecutor;
|
|
16
17
|
constructor(toolsConfigDir: string, config: BridgeConfig);
|
|
17
18
|
/**
|
|
18
19
|
* Load all tools from YAML config files. Returns tool count.
|
|
@@ -24,7 +25,6 @@ export declare class ToolRegistry {
|
|
|
24
25
|
* No "originalName" tracking needed — the binding is in the executor itself.
|
|
25
26
|
*/
|
|
26
27
|
private loadRemoteMcpTools;
|
|
27
|
-
private interpolateContainerName;
|
|
28
28
|
private createExecutor;
|
|
29
29
|
getToolNames(): string[];
|
|
30
30
|
getTool(name: string): RegisteredTool | undefined;
|
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,OAAO,KAAK,EACV,YAAY,EAIZ,mBAAmB,EACnB,cAAc,EAKf,MAAM,YAAY,CAAC;AAEpB,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;gBAE1C,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY;IAexD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;YAgCpB,cAAc;IAoB5B;;;OAGG;YACW,kBAAkB;IAmDhC,OAAO,CAAC,cAAc;IAyDtB,YAAY,IAAI,MAAM,EAAE;IACxB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IACjD,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;IAE1C;;;OAGG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAwB5F;;OAEG;IACH,OAAO,CAAC,cAAc;CAsBvB"}
|
package/dist/registry.js
CHANGED
|
@@ -12,6 +12,8 @@ import { resolve, join } from "node:path";
|
|
|
12
12
|
import { globSync } from "glob";
|
|
13
13
|
import yaml from "js-yaml";
|
|
14
14
|
import { getLogger } from "./logger.js";
|
|
15
|
+
import { resolveEnvVars } from "./env-resolve.js";
|
|
16
|
+
import { SshExecutor } from "./executors/ssh.js";
|
|
15
17
|
import { CommandToolExecutor } from "./executors/command.js";
|
|
16
18
|
import { McpProxyExecutor, BoundRemoteToolExecutor } from "./executors/mcp-proxy.js";
|
|
17
19
|
export class ToolRegistry {
|
|
@@ -19,9 +21,13 @@ export class ToolRegistry {
|
|
|
19
21
|
config;
|
|
20
22
|
tools = new Map();
|
|
21
23
|
argPreprocessor;
|
|
24
|
+
containerExecutor;
|
|
22
25
|
constructor(toolsConfigDir, config) {
|
|
23
26
|
this.toolsConfigDir = resolve(toolsConfigDir);
|
|
24
27
|
this.config = config;
|
|
28
|
+
// Initialize standard container executor (now SSH based)
|
|
29
|
+
// Pass the configured SSH user or fall back to environment
|
|
30
|
+
this.containerExecutor = new SshExecutor(config.sshUser);
|
|
25
31
|
// Path normalization as a composable preprocessor.
|
|
26
32
|
// Converts devcontainer paths (e.g. /workspace/...) to container paths (/var/www/html/...).
|
|
27
33
|
const hostRoot = config.hostProjectRoot;
|
|
@@ -132,11 +138,6 @@ export class ToolRegistry {
|
|
|
132
138
|
return 0;
|
|
133
139
|
}
|
|
134
140
|
}
|
|
135
|
-
interpolateContainerName(container) {
|
|
136
|
-
return container?.includes("{DDEV_PROJECT}")
|
|
137
|
-
? container.replace(/\{DDEV_PROJECT\}/g, this.config.ddevProject)
|
|
138
|
-
: container;
|
|
139
|
-
}
|
|
140
141
|
createExecutor(toolConfig) {
|
|
141
142
|
const log = getLogger();
|
|
142
143
|
const type = toolConfig.type ?? "command";
|
|
@@ -148,12 +149,23 @@ export class ToolRegistry {
|
|
|
148
149
|
log.error(`Tool ${name}: missing command_template`);
|
|
149
150
|
return null;
|
|
150
151
|
}
|
|
152
|
+
if (!cfg.ssh_target) {
|
|
153
|
+
log.error(`Tool ${name}: missing ssh_target`);
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
// Resolve environment variables and bridge placeholders
|
|
157
|
+
const sshTarget = resolveEnvVars(cfg.ssh_target, process.env, {
|
|
158
|
+
DDEV_PROJECT: this.config.ddevProject,
|
|
159
|
+
});
|
|
160
|
+
const sshUser = cfg.ssh_user ? resolveEnvVars(cfg.ssh_user) : undefined;
|
|
161
|
+
const workingDir = cfg.working_dir ? resolveEnvVars(cfg.working_dir) : undefined;
|
|
151
162
|
return new CommandToolExecutor({
|
|
152
163
|
commandTemplate: cfg.command_template,
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
164
|
+
host: sshTarget,
|
|
165
|
+
executor: this.containerExecutor, // Inject SSH executor
|
|
166
|
+
sshUser,
|
|
156
167
|
shell: cfg.shell,
|
|
168
|
+
workingDir,
|
|
157
169
|
defaultArgs: cfg.default_args,
|
|
158
170
|
disallowedCommands: cfg.disallowed_commands,
|
|
159
171
|
validationRules: cfg.validation_rules,
|
package/dist/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAcrF,MAAM,OAAO,YAAY;IACN,cAAc,CAAS;IACvB,MAAM,CAAe;IACrB,KAAK,GAAgC,IAAI,GAAG,EAAE,CAAC;IAC/C,eAAe,CAAkB;IACjC,iBAAiB,CAAoB;IAEtD,YAAY,cAAsB,EAAE,MAAoB;QACtD,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,yDAAyD;QACzD,2DAA2D;QAC3D,IAAI,CAAC,iBAAiB,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEzD,mDAAmD;QACnD,4FAA4F;QAC5F,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC;QACxC,MAAM,aAAa,GAAG,MAAM,CAAC,oBAAoB,CAAC;QAClD,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IACtF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QAExB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,KAAK,CAAC,qCAAqC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;YACtE,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3E,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YACjD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAChD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAA2B,CAAC;gBAEhE,IAAI,CAAC,UAAU,EAAE,CAAC;oBAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBACtE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;oBAAC,GAAG,CAAC,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAEjF,KAAK,MAAM,UAAU,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;oBAC1C,WAAW,IAAI,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,GAAG,CAAC,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,YAAY,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,UAAU,WAAW,QAAQ,CAAC,CAAC;QACxC,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,UAAsB;QACjD,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;QAE7B,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAChE,IAAI,UAAU,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;YAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAEnF,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;YAAC,GAAG,CAAC,IAAI,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;YAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAE5E,+EAA+E;QAC/E,IAAI,UAAU,CAAC,IAAI,KAAK,YAAY,IAAK,UAAkC,CAAC,mBAAmB,EAAE,CAAC;YAChG,OAAO,IAAI,CAAC,kBAAkB,CAAC,UAAiC,EAAE,QAA4B,CAAC,CAAC;QAClG,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;QACjC,OAAO,CAAC,CAAC;IACX,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,kBAAkB,CAC9B,WAAgC,EAChC,KAAuB;QAEvB,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC;QACnC,GAAG,CAAC,IAAI,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;QAErD,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,IAAI,EAAE,CAAC;YACnD,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;gBACrC,KAAK,CAAC,gBAAgB,EAAE;gBACxB,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC/B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,WAAW,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC,CACzF;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;gBAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC;gBAAC,OAAO,CAAC,CAAC;YAAC,CAAC;YAE/E,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,IAAI,EAAE,CAAC;YAC7C,IAAI,KAAK,GAAG,CAAC,CAAC;YAEd,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;gBACjC,IAAI,CAAC,MAAM,CAAC,IAAI;oBAAE,SAAS;gBAE3B,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;gBAEnE,qFAAqF;gBACrF,MAAM,aAAa,GAAG,IAAI,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBAEtE,MAAM,aAAa,GAAwB;oBACzC,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;oBACrC,IAAI,EAAE,YAAY;oBAClB,YAAY,EAAE,MAAM,CAAC,WAAyC;oBAC9D,UAAU,EAAE,WAAW,CAAC,UAAU;iBACnC,CAAC;gBAEF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;gBAC9E,GAAG,CAAC,IAAI,CAAC,uBAAuB,SAAS,UAAU,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;gBACnE,KAAK,EAAE,CAAC;YACV,CAAC;YAED,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,eAAe,SAAS,EAAE,CAAC,CAAC;YACpD,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,GAAG,CAAC,KAAK,CAAC,oCAAoC,SAAS,KAAK,CAAC,EAAE,CAAC,CAAC;YACjE,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,UAAsB;QAC3C,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI,SAAS,CAAC;QAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;QAE7B,IAAI,CAAC;YACH,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,GAAG,GAAG,UAA+B,CAAC;gBAC5C,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;oBAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,4BAA4B,CAAC,CAAC;oBAAC,OAAO,IAAI,CAAC;gBAAC,CAAC;gBAChG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;oBAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,sBAAsB,CAAC,CAAC;oBAAC,OAAO,IAAI,CAAC;gBAAC,CAAC;gBAEpF,wDAAwD;gBACxD,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,GAA6B,EAAE;oBACtF,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;iBACtC,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACxE,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAEjF,OAAO,IAAI,mBAAmB,CAAC;oBAC7B,eAAe,EAAE,GAAG,CAAC,gBAAgB;oBACrC,IAAI,EAAE,SAAS;oBACf,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,sBAAsB;oBACxD,OAAO;oBACP,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,UAAU;oBACV,WAAW,EAAE,GAAG,CAAC,YAAY;oBAC7B,kBAAkB,EAAE,GAAG,CAAC,mBAAmB;oBAC3C,eAAe,EAAE,GAAG,CAAC,gBAAgB;iBACtC,CAAC,CAAC;YACL,CAAC;YAED,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1B,MAAM,GAAG,GAAG,UAAiC,CAAC;gBAC9C,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;oBAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,sBAAsB,CAAC,CAAC;oBAAC,OAAO,IAAI,CAAC;gBAAC,CAAC;gBAEpF,OAAO,IAAI,gBAAgB,CAAC;oBAC1B,SAAS,EAAE,GAAG,CAAC,UAAU;oBACzB,WAAW,EAAE,GAAG,CAAC,YAAY;oBAC7B,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,YAAY,EAAE,GAAG,CAAC,aAAa;oBAC/B,YAAY,EAAE,GAAG,CAAC,aAAa;oBAC/B,SAAS,EAAE,GAAG,CAAC,UAAU;oBACzB,cAAc,EAAE,GAAG,CAAC,gBAAgB;oBACpC,SAAS,EAAE,GAAG,CAAC,UAAU;iBAC1B,CAAC,CAAC;YACL,CAAC;YAED,GAAG,CAAC,KAAK,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,GAAG,CAAC,KAAK,CAAC,+BAA+B,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,qBAAqB;IAErB,YAAY,KAAe,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAY,IAAgC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClF,WAAW,KAAkC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAEjE;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,IAA6B;QAC3D,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,OAAO,EAAE,wBAAwB,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAEpF,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC;QAEhC,IAAI,CAAC;YACH,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,qBAAsB,CAAW,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjF,CAAC;QAED,2CAA2C;QAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEjD,IAAI,CAAC;YACH,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,GAAG,CAAC,KAAK,CAAC,mBAAmB,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;YAC3C,OAAO,EAAE,OAAO,EAAE,UAAW,CAAW,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACtE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,cAAc,CACpB,KAA8B,EAC9B,QAAgB,EAChB,aAAqB;QAErB,MAAM,SAAS,GAAG,CAAC,CAAU,EAAW,EAAE;YACxC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC1B,OAAO,CAAC,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC;oBACjC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAC1C,CAAC,CAAC,CAAC,CAAC;YACR,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACxC,MAAM,MAAM,GAA4B,EAAE,CAAC;gBAC3C,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;oBAAE,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;gBACrE,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC;QAEF,OAAO,SAAS,CAAC,KAAK,CAA4B,CAAC;IACrD,CAAC;CACF"}
|
package/dist/types.d.ts
CHANGED
|
@@ -28,12 +28,13 @@ export interface JsonSchemaProperty {
|
|
|
28
28
|
enum?: string[];
|
|
29
29
|
default?: unknown;
|
|
30
30
|
}
|
|
31
|
-
/** Configuration for a command-type tool (
|
|
31
|
+
/** Configuration for a command-type tool (SSH execution). */
|
|
32
32
|
export interface CommandToolConfig extends BaseToolConfig {
|
|
33
33
|
type: "command";
|
|
34
34
|
command_template: string;
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
ssh_target: string;
|
|
36
|
+
ssh_user?: string;
|
|
37
|
+
working_dir?: string;
|
|
37
38
|
shell?: string;
|
|
38
39
|
default_args?: Record<string, string>;
|
|
39
40
|
disallowed_commands?: string[];
|
|
@@ -94,5 +95,17 @@ export interface BridgeConfig {
|
|
|
94
95
|
hostProjectRoot: string;
|
|
95
96
|
/** Container project root for path normalization. */
|
|
96
97
|
containerProjectRoot: string;
|
|
98
|
+
/** SSH user for container connections (defaults to current user). */
|
|
99
|
+
sshUser?: string;
|
|
100
|
+
}
|
|
101
|
+
/** Interface for executing commands via SSH. */
|
|
102
|
+
export interface ContainerExecutor {
|
|
103
|
+
execute(options: {
|
|
104
|
+
host: string;
|
|
105
|
+
command: string[];
|
|
106
|
+
user?: string;
|
|
107
|
+
shell?: string;
|
|
108
|
+
workingDir?: string;
|
|
109
|
+
}): Promise<string>;
|
|
97
110
|
}
|
|
98
111
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,kDAAkD;AAClD,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;AAEhD,mDAAmD;AACnD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,QAAQ,CAAC;IACf,YAAY,CAAC,EAAE,UAAU,CAAC;CAC3B;AAED,wDAAwD;AACxD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wunderio/wdrmcp",
|
|
3
3
|
"mcpName": "io.github.wunderio/wdrmcp",
|
|
4
|
-
"version": "0.1.
|
|
5
|
-
"description": "A generic MCP server that dynamically loads tool definitions from YAML configuration files and executes them
|
|
4
|
+
"version": "0.1.5",
|
|
5
|
+
"description": "A generic MCP server that dynamically loads tool definitions from YAML configuration files and executes them via SSH on remote hosts or proxies them to remote MCP servers.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
8
|
"wdrmcp": "dist/index.js"
|
|
@@ -48,4 +48,4 @@
|
|
|
48
48
|
"@types/node": "^22.0.0",
|
|
49
49
|
"typescript": "^5.7.0"
|
|
50
50
|
}
|
|
51
|
-
}
|
|
51
|
+
}
|