host-execution-mcp 1.0.0 → 2.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.
- package/CHANGELOG.md +44 -0
- package/README.md +14 -12
- package/SECURITY.md +3 -3
- package/dist/access/index.d.ts +21 -10
- package/dist/access/index.js +55 -27
- package/dist/access/index.js.map +1 -1
- package/dist/access/paradi-auth.d.ts +3 -3
- package/dist/access/paradi-auth.js +4 -4
- package/dist/access/paradi-auth.js.map +1 -1
- package/dist/access/paradi-transport.d.ts +1 -1
- package/dist/access/paradi-transport.js +3 -3
- package/dist/access/paradi-transport.js.map +1 -1
- package/dist/access/paradi-username.d.ts +1 -1
- package/dist/access/paradi-username.js +2 -2
- package/dist/access/paradi-username.js.map +1 -1
- package/dist/access/session-pool.d.ts +5 -0
- package/dist/access/session-pool.js +7 -0
- package/dist/access/session-pool.js.map +1 -1
- package/dist/access/ssh-transport.d.ts +1 -1
- package/dist/access/ssh-transport.js +3 -2
- package/dist/access/ssh-transport.js.map +1 -1
- package/dist/config-yaml.d.ts +54 -0
- package/dist/config-yaml.js +172 -0
- package/dist/config-yaml.js.map +1 -0
- package/dist/config.d.ts +45 -1
- package/dist/config.js +126 -22
- package/dist/config.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts +4 -1
- package/dist/instructions.js +92 -70
- package/dist/instructions.js.map +1 -1
- package/dist/kubectl/runner.d.ts +7 -8
- package/dist/kubectl/runner.js +18 -21
- package/dist/kubectl/runner.js.map +1 -1
- package/dist/link-runtime.d.ts +39 -0
- package/dist/link-runtime.js +134 -0
- package/dist/link-runtime.js.map +1 -0
- package/dist/server.d.ts +2 -1
- package/dist/server.js +10 -12
- package/dist/server.js.map +1 -1
- package/dist/sources/guides.d.ts +34 -0
- package/dist/sources/guides.js +50 -0
- package/dist/sources/guides.js.map +1 -0
- package/dist/sources/index.d.ts +5 -0
- package/dist/sources/index.js +22 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/yaml-template.d.ts +31 -0
- package/dist/sources/yaml-template.js +35 -0
- package/dist/sources/yaml-template.js.map +1 -0
- package/dist/ssh/access-client.d.ts +6 -2
- package/dist/ssh/access-client.js +58 -27
- package/dist/ssh/access-client.js.map +1 -1
- package/dist/ssh/access-errors.js +1 -1
- package/dist/ssh/access-errors.js.map +1 -1
- package/dist/ssh/access-sftp.js +3 -3
- package/dist/ssh/access-sftp.js.map +1 -1
- package/dist/tools/copy-job-schemas.d.ts +96 -581
- package/dist/tools/copy-job-schemas.js +9 -9
- package/dist/tools/copy-job-schemas.js.map +1 -1
- package/dist/tools/register.d.ts +2 -10
- package/dist/tools/register.js +174 -331
- package/dist/tools/register.js.map +1 -1
- package/dist/tools/remote-schemas.d.ts +156 -708
- package/dist/tools/remote-schemas.js +99 -103
- package/dist/tools/remote-schemas.js.map +1 -1
- package/dist/utils/copy-executor.d.ts +3 -1
- package/dist/utils/copy-executor.js +39 -25
- package/dist/utils/copy-executor.js.map +1 -1
- package/dist/utils/copy-transfer.d.ts +2 -0
- package/dist/utils/copy-transfer.js.map +1 -1
- package/dist/utils/remote-executor.d.ts +3 -4
- package/dist/utils/remote-executor.js +8 -18
- package/dist/utils/remote-executor.js.map +1 -1
- package/dist/utils/remote-target.js +1 -1
- package/dist/utils/remote-target.js.map +1 -1
- package/docs/AGENT_GUIDE.md +31 -103
- package/docs/CONFIGURATION.md +39 -10
- package/docs/GUIDE.md +186 -0
- package/docs/PARADI_ACCESS_PLAN.md +6 -6
- package/docs/TODO.md +4 -11
- package/docs/USER_GUIDE.zh-CN.md +38 -69
- package/docs/host-execution.yaml +92 -0
- package/docs/paradi-gateway-interactive.png +0 -0
- package/package.json +67 -65
- package/dist/ssh/bastion-client.d.ts +0 -60
- package/dist/ssh/bastion-client.js +0 -423
- package/dist/ssh/bastion-client.js.map +0 -1
- package/dist/ssh/bastion-errors.d.ts +0 -62
- package/dist/ssh/bastion-errors.js +0 -190
- package/dist/ssh/bastion-errors.js.map +0 -1
- package/dist/ssh/hop1-sftp.d.ts +0 -14
- package/dist/ssh/hop1-sftp.js +0 -437
- package/dist/ssh/hop1-sftp.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh-transport.js","sourceRoot":"","sources":["../../src/access/ssh-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ssh-transport.js","sourceRoot":"","sources":["../../src/access/ssh-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { type AppConfig } from "./config.js";
|
|
2
|
+
export declare const YAML_ROSTER_REL: readonly [".agents", "host-execution.yaml"];
|
|
3
|
+
export declare const YAML_ROSTER_SEED = "# \u540D\u518C\u3002\u8FFD\u52A0\u94FE\u8DEF\u524D\u5148\u8BFB MCP Resource host-execution://guides/yaml\uFF08\u5BF9\u7167 GUIDE \u00A72\uFF09\u3002\n# Linux/mac \u672C\u6587\u4EF6\uFF1BWindows \u4E3A %USERPROFILE%\\.agents\\host-execution.yaml\nlinks: []\n";
|
|
4
|
+
export type YamlLink = {
|
|
5
|
+
description: string;
|
|
6
|
+
config: AppConfig;
|
|
7
|
+
};
|
|
8
|
+
export type YamlFs = {
|
|
9
|
+
existsSync: (filePath: string) => boolean;
|
|
10
|
+
mkdirSync: (dir: string, opts: {
|
|
11
|
+
recursive: boolean;
|
|
12
|
+
}) => void;
|
|
13
|
+
readFileSync: (filePath: string, encoding: BufferEncoding) => string;
|
|
14
|
+
writeFileSync: (filePath: string, data: string, encoding: BufferEncoding) => void;
|
|
15
|
+
};
|
|
16
|
+
export type YamlRosterDeps = {
|
|
17
|
+
homeDir?: string;
|
|
18
|
+
env?: NodeJS.ProcessEnv;
|
|
19
|
+
fs?: YamlFs;
|
|
20
|
+
};
|
|
21
|
+
export type ConfigSource = {
|
|
22
|
+
mode: "json";
|
|
23
|
+
config: AppConfig;
|
|
24
|
+
} | {
|
|
25
|
+
mode: "yaml";
|
|
26
|
+
path: string;
|
|
27
|
+
homeDir: string;
|
|
28
|
+
env: NodeJS.ProcessEnv;
|
|
29
|
+
};
|
|
30
|
+
export declare function yamlRosterPath(homeDir?: string): string;
|
|
31
|
+
export declare function ensureYamlRoster(deps?: YamlRosterDeps): {
|
|
32
|
+
path: string;
|
|
33
|
+
created: boolean;
|
|
34
|
+
};
|
|
35
|
+
export declare function hasAccessEnv(env: NodeJS.ProcessEnv): boolean;
|
|
36
|
+
export declare function parseYamlRoster(text: string, timeouts?: {
|
|
37
|
+
defaultTimeoutMs: number;
|
|
38
|
+
maxOutputChars: number;
|
|
39
|
+
}): YamlLink[];
|
|
40
|
+
export declare function readYamlRoster(deps?: YamlRosterDeps): {
|
|
41
|
+
path: string;
|
|
42
|
+
links: YamlLink[];
|
|
43
|
+
};
|
|
44
|
+
export declare function listYamlDescriptions(links: YamlLink[]): string;
|
|
45
|
+
export declare function pickYamlLink(links: YamlLink[], description?: string): YamlLink;
|
|
46
|
+
/**
|
|
47
|
+
* YAML wins when the roster has at least one real link.
|
|
48
|
+
* Empty seed + ACCESS_HOST/USER → existing JSON loadConfig.
|
|
49
|
+
* Empty seed and no ACCESS_* → YAML mode so the process can still start.
|
|
50
|
+
*/
|
|
51
|
+
export declare function resolveConfigSource(deps?: YamlRosterDeps): ConfigSource;
|
|
52
|
+
export declare function loadSourceLinks(source: ConfigSource, deps?: YamlRosterDeps): YamlLink[];
|
|
53
|
+
export declare function isAppConfig(value: AppConfig | ConfigSource): value is AppConfig;
|
|
54
|
+
export declare function asConfigSource(value: AppConfig | ConfigSource): ConfigSource;
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { load as loadYaml } from "js-yaml";
|
|
5
|
+
import { loadConfig, loadConfigFromInput, parseProcessTimeouts, } from "./config.js";
|
|
6
|
+
export const YAML_ROSTER_REL = [".agents", "host-execution.yaml"];
|
|
7
|
+
export const YAML_ROSTER_SEED = `# 名册。追加链路前先读 MCP Resource host-execution://guides/yaml(对照 GUIDE §2)。
|
|
8
|
+
# Linux/mac 本文件;Windows 为 %USERPROFILE%\\.agents\\host-execution.yaml
|
|
9
|
+
links: []
|
|
10
|
+
`;
|
|
11
|
+
const LINK_FIELD_KEYS = [
|
|
12
|
+
"ACCESS_KIND",
|
|
13
|
+
"ACCESS_HOST",
|
|
14
|
+
"ACCESS_USER",
|
|
15
|
+
"ACCESS_PORT",
|
|
16
|
+
"ACCESS_PRIVATE_KEY_PATH",
|
|
17
|
+
"ACCESS_PASSWORD",
|
|
18
|
+
"ACCESS_PARADI_AUTH",
|
|
19
|
+
"TARGET_HOSTS",
|
|
20
|
+
"TARGET_HOST",
|
|
21
|
+
"TARGET_USER",
|
|
22
|
+
"TARGET_PASSWORD",
|
|
23
|
+
"ALLOWED_NAMESPACES",
|
|
24
|
+
"ACCESS_POLICY_ALLOWED_NAMESPACES",
|
|
25
|
+
];
|
|
26
|
+
export function yamlRosterPath(homeDir = os.homedir()) {
|
|
27
|
+
return path.join(homeDir, ...YAML_ROSTER_REL);
|
|
28
|
+
}
|
|
29
|
+
export function ensureYamlRoster(deps = {}) {
|
|
30
|
+
const homeDir = deps.homeDir ?? os.homedir();
|
|
31
|
+
const disk = deps.fs ?? fs;
|
|
32
|
+
const filePath = yamlRosterPath(homeDir);
|
|
33
|
+
if (disk.existsSync(filePath)) {
|
|
34
|
+
return { path: filePath, created: false };
|
|
35
|
+
}
|
|
36
|
+
disk.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
37
|
+
disk.writeFileSync(filePath, YAML_ROSTER_SEED, "utf8");
|
|
38
|
+
return { path: filePath, created: true };
|
|
39
|
+
}
|
|
40
|
+
export function hasAccessEnv(env) {
|
|
41
|
+
return Boolean(env.ACCESS_HOST?.trim() && env.ACCESS_USER?.trim());
|
|
42
|
+
}
|
|
43
|
+
function asConfigInput(raw, timeouts) {
|
|
44
|
+
const input = {
|
|
45
|
+
DEFAULT_TIMEOUT_MS: timeouts.defaultTimeoutMs,
|
|
46
|
+
MAX_OUTPUT_CHARS: timeouts.maxOutputChars,
|
|
47
|
+
};
|
|
48
|
+
for (const key of LINK_FIELD_KEYS) {
|
|
49
|
+
if (!(key in raw) || raw[key] == null) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const value = raw[key];
|
|
53
|
+
if (key === "TARGET_HOSTS") {
|
|
54
|
+
if (Array.isArray(value)) {
|
|
55
|
+
input.TARGET_HOSTS = value.map((item) => String(item));
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
input.TARGET_HOSTS = String(value);
|
|
59
|
+
}
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
input[key] = value;
|
|
63
|
+
}
|
|
64
|
+
return input;
|
|
65
|
+
}
|
|
66
|
+
export function parseYamlRoster(text, timeouts = {
|
|
67
|
+
defaultTimeoutMs: 60_000,
|
|
68
|
+
maxOutputChars: 65_536,
|
|
69
|
+
}) {
|
|
70
|
+
const normalized = text.replace(/^\uFEFF/, "").replace(/\r\n/g, "\n");
|
|
71
|
+
const doc = loadYaml(normalized);
|
|
72
|
+
if (doc == null) {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
if (typeof doc !== "object" || Array.isArray(doc)) {
|
|
76
|
+
throw new Error("YAML roster must be a mapping with a links array");
|
|
77
|
+
}
|
|
78
|
+
const linksRaw = doc.links;
|
|
79
|
+
if (linksRaw == null) {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
if (!Array.isArray(linksRaw)) {
|
|
83
|
+
throw new Error("YAML roster links must be an array");
|
|
84
|
+
}
|
|
85
|
+
const seen = new Set();
|
|
86
|
+
const links = [];
|
|
87
|
+
for (const item of linksRaw) {
|
|
88
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) {
|
|
89
|
+
throw new Error("each YAML link must be a mapping with a unique description");
|
|
90
|
+
}
|
|
91
|
+
const raw = item;
|
|
92
|
+
const description = String(raw.description ?? "").trim();
|
|
93
|
+
if (!description) {
|
|
94
|
+
throw new Error("each YAML link requires a unique description");
|
|
95
|
+
}
|
|
96
|
+
if (seen.has(description)) {
|
|
97
|
+
throw new Error(`duplicate YAML description: ${description}`);
|
|
98
|
+
}
|
|
99
|
+
seen.add(description);
|
|
100
|
+
links.push({
|
|
101
|
+
description,
|
|
102
|
+
config: loadConfigFromInput(asConfigInput(raw, timeouts)),
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return links;
|
|
106
|
+
}
|
|
107
|
+
export function readYamlRoster(deps = {}) {
|
|
108
|
+
const homeDir = deps.homeDir ?? os.homedir();
|
|
109
|
+
const env = deps.env ?? process.env;
|
|
110
|
+
const disk = deps.fs ?? fs;
|
|
111
|
+
const filePath = yamlRosterPath(homeDir);
|
|
112
|
+
if (!disk.existsSync(filePath)) {
|
|
113
|
+
return { path: filePath, links: [] };
|
|
114
|
+
}
|
|
115
|
+
const text = disk.readFileSync(filePath, "utf8");
|
|
116
|
+
return { path: filePath, links: parseYamlRoster(text, parseProcessTimeouts(env)) };
|
|
117
|
+
}
|
|
118
|
+
export function listYamlDescriptions(links) {
|
|
119
|
+
return links.map((link) => JSON.stringify(link.description)).join(", ");
|
|
120
|
+
}
|
|
121
|
+
export function pickYamlLink(links, description) {
|
|
122
|
+
const wanted = description?.trim();
|
|
123
|
+
if (links.length === 0) {
|
|
124
|
+
throw new Error("YAML roster is empty. Append a link to ~/.agents/host-execution.yaml using MCP Resource host-execution://guides/yaml (GUIDE §2). Do not invent fields.");
|
|
125
|
+
}
|
|
126
|
+
if (wanted) {
|
|
127
|
+
const hit = links.find((link) => link.description === wanted);
|
|
128
|
+
if (!hit) {
|
|
129
|
+
throw new Error(`No YAML link with description=${JSON.stringify(wanted)}. Known: ${listYamlDescriptions(links)}`);
|
|
130
|
+
}
|
|
131
|
+
return hit;
|
|
132
|
+
}
|
|
133
|
+
if (links.length === 1) {
|
|
134
|
+
return links[0];
|
|
135
|
+
}
|
|
136
|
+
throw new Error(`Multiple YAML links; pass exact description. Known: ${listYamlDescriptions(links)}`);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* YAML wins when the roster has at least one real link.
|
|
140
|
+
* Empty seed + ACCESS_HOST/USER → existing JSON loadConfig.
|
|
141
|
+
* Empty seed and no ACCESS_* → YAML mode so the process can still start.
|
|
142
|
+
*/
|
|
143
|
+
export function resolveConfigSource(deps = {}) {
|
|
144
|
+
const homeDir = deps.homeDir ?? os.homedir();
|
|
145
|
+
const env = deps.env ?? process.env;
|
|
146
|
+
const seeded = ensureYamlRoster(deps);
|
|
147
|
+
const { links } = readYamlRoster({ ...deps, homeDir, env });
|
|
148
|
+
if (links.length > 0) {
|
|
149
|
+
return { mode: "yaml", path: seeded.path, homeDir, env };
|
|
150
|
+
}
|
|
151
|
+
if (hasAccessEnv(env)) {
|
|
152
|
+
return { mode: "json", config: loadConfig(env) };
|
|
153
|
+
}
|
|
154
|
+
return { mode: "yaml", path: seeded.path, homeDir, env };
|
|
155
|
+
}
|
|
156
|
+
export function loadSourceLinks(source, deps = {}) {
|
|
157
|
+
if (source.mode === "json") {
|
|
158
|
+
return [{ description: "", config: source.config }];
|
|
159
|
+
}
|
|
160
|
+
return readYamlRoster({
|
|
161
|
+
homeDir: deps.homeDir ?? source.homeDir,
|
|
162
|
+
env: deps.env ?? source.env,
|
|
163
|
+
fs: deps.fs,
|
|
164
|
+
}).links;
|
|
165
|
+
}
|
|
166
|
+
export function isAppConfig(value) {
|
|
167
|
+
return "accessHost" in value && "accessUser" in value && !("mode" in value);
|
|
168
|
+
}
|
|
169
|
+
export function asConfigSource(value) {
|
|
170
|
+
return isAppConfig(value) ? { mode: "json", config: value } : value;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=config-yaml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-yaml.js","sourceRoot":"","sources":["../src/config-yaml.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -12,7 +12,13 @@ export interface AppConfig {
|
|
|
12
12
|
* for this MCP process. Customers normally leave unset.
|
|
13
13
|
*/
|
|
14
14
|
accessParadiAuth?: ParadiAuthSetting;
|
|
15
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* Known hop-2 hosts from TARGET_HOSTS (concrete IP or hostname only).
|
|
17
|
+
* One entry → also exposed as `targetHost` (internal default selector).
|
|
18
|
+
* 0 or many → no default; caller must pass host from user context.
|
|
19
|
+
*/
|
|
20
|
+
targetHosts?: string[];
|
|
21
|
+
/** Internal default derive selector when TARGET_HOSTS is exactly one host. */
|
|
16
22
|
targetHost?: string;
|
|
17
23
|
targetUser?: string;
|
|
18
24
|
targetPassword?: string;
|
|
@@ -21,6 +27,17 @@ export interface AppConfig {
|
|
|
21
27
|
/** Policy (k8s only); not part of Access matrix. Prefer ACCESS_POLICY_ALLOWED_NAMESPACES. */
|
|
22
28
|
allowedNamespaces?: string[];
|
|
23
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Parse TARGET_HOSTS: env comma list, or a real string array.
|
|
32
|
+
* Concrete hosts only. Do not pass a JSON-encoded array string.
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseTargetHostField(raw: string | string[] | undefined): string[];
|
|
35
|
+
/** Exact hop-2 host (not CIDR `/` or glob `*`). */
|
|
36
|
+
export declare function isConcreteTargetHost(value: string): boolean;
|
|
37
|
+
/** Default derive host: only when the list is exactly one concrete entry. */
|
|
38
|
+
export declare function defaultTargetHost(hosts: string[]): string | undefined;
|
|
39
|
+
/** Probe-only: default landing, else first listed host. */
|
|
40
|
+
export declare function paradiProbeHost(config: AppConfig): string | undefined;
|
|
24
41
|
/**
|
|
25
42
|
* Hop-1 SSH identity: where we TCP-connect and which username to present.
|
|
26
43
|
* Paradi: uses pinned/auto-preferred mode for username (password resolved separately).
|
|
@@ -30,6 +47,33 @@ export declare function resolveAccessSshIdentity(config: AppConfig): {
|
|
|
30
47
|
port: number;
|
|
31
48
|
username: string;
|
|
32
49
|
};
|
|
50
|
+
/** Field bag for env or a YAML link (same GUIDE §2 names). */
|
|
51
|
+
export type ConfigInput = {
|
|
52
|
+
ACCESS_KIND?: string;
|
|
53
|
+
ACCESS_HOST?: string;
|
|
54
|
+
ACCESS_USER?: string;
|
|
55
|
+
ACCESS_PORT?: string | number;
|
|
56
|
+
ACCESS_PRIVATE_KEY_PATH?: string;
|
|
57
|
+
ACCESS_PASSWORD?: string;
|
|
58
|
+
ACCESS_PARADI_AUTH?: string;
|
|
59
|
+
TARGET_HOSTS?: string | string[];
|
|
60
|
+
TARGET_HOST?: string;
|
|
61
|
+
TARGET_USER?: string;
|
|
62
|
+
TARGET_PASSWORD?: string;
|
|
63
|
+
DEFAULT_TIMEOUT_MS?: string | number;
|
|
64
|
+
MAX_OUTPUT_CHARS?: string | number;
|
|
65
|
+
ALLOWED_NAMESPACES?: string;
|
|
66
|
+
ACCESS_POLICY_ALLOWED_NAMESPACES?: string;
|
|
67
|
+
};
|
|
68
|
+
export declare function parseProcessTimeouts(env?: NodeJS.ProcessEnv): {
|
|
69
|
+
defaultTimeoutMs: number;
|
|
70
|
+
maxOutputChars: number;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Load MCP config from GUIDE §2 fields (env or one YAML link).
|
|
74
|
+
* Legacy BASTION_* / REMOTE_SSH_* aliases were removed in 4.0.0.
|
|
75
|
+
*/
|
|
76
|
+
export declare function loadConfigFromInput(input: ConfigInput): AppConfig;
|
|
33
77
|
/**
|
|
34
78
|
* Load MCP config. Only ACCESS_* / TARGET_* (and policy ALLOWED_NAMESPACES).
|
|
35
79
|
* Legacy BASTION_* / REMOTE_SSH_* aliases were removed in 4.0.0.
|
package/dist/config.js
CHANGED
|
@@ -2,6 +2,64 @@ import fs from "node:fs";
|
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { getPinnedParadiAuth, parseParadiAuthSetting, resolveParadiConnectParams, } from "./access/paradi-auth.js";
|
|
5
|
+
function uniqueTrimmed(values) {
|
|
6
|
+
const seen = new Set();
|
|
7
|
+
const out = [];
|
|
8
|
+
for (const value of values) {
|
|
9
|
+
const item = value.trim();
|
|
10
|
+
if (!item || seen.has(item)) {
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
seen.add(item);
|
|
14
|
+
out.push(item);
|
|
15
|
+
}
|
|
16
|
+
return out;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Parse TARGET_HOSTS: env comma list, or a real string array.
|
|
20
|
+
* Concrete hosts only. Do not pass a JSON-encoded array string.
|
|
21
|
+
*/
|
|
22
|
+
export function parseTargetHostField(raw) {
|
|
23
|
+
if (raw == null) {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
const hosts = Array.isArray(raw)
|
|
27
|
+
? uniqueTrimmed(raw)
|
|
28
|
+
: parseTargetHostString(raw);
|
|
29
|
+
for (const host of hosts) {
|
|
30
|
+
if (!isConcreteTargetHost(host)) {
|
|
31
|
+
throw new Error(`TARGET_HOSTS must be concrete hosts (IP or hostname), not CIDR or glob (got "${host}")`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return hosts;
|
|
35
|
+
}
|
|
36
|
+
function parseTargetHostString(raw) {
|
|
37
|
+
const trimmed = raw.trim();
|
|
38
|
+
if (!trimmed) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
if (trimmed.startsWith("[")) {
|
|
42
|
+
throw new Error("TARGET_HOSTS is a comma-separated list (e.g. 10.0.0.5,10.0.0.6), not a JSON array string");
|
|
43
|
+
}
|
|
44
|
+
return uniqueTrimmed(trimmed.split(","));
|
|
45
|
+
}
|
|
46
|
+
/** Exact hop-2 host (not CIDR `/` or glob `*`). */
|
|
47
|
+
export function isConcreteTargetHost(value) {
|
|
48
|
+
const host = value.trim();
|
|
49
|
+
return Boolean(host) && !host.includes("/") && !host.includes("*");
|
|
50
|
+
}
|
|
51
|
+
/** Default derive host: only when the list is exactly one concrete entry. */
|
|
52
|
+
export function defaultTargetHost(hosts) {
|
|
53
|
+
const only = hosts[0];
|
|
54
|
+
if (only !== undefined && hosts.length === 1 && isConcreteTargetHost(only)) {
|
|
55
|
+
return only;
|
|
56
|
+
}
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
/** Probe-only: default landing, else first listed host. */
|
|
60
|
+
export function paradiProbeHost(config) {
|
|
61
|
+
return config.targetHost?.trim() || config.targetHosts?.[0];
|
|
62
|
+
}
|
|
5
63
|
function parseAllowedNamespaces(value) {
|
|
6
64
|
if (!value?.trim()) {
|
|
7
65
|
return undefined;
|
|
@@ -20,7 +78,7 @@ export function resolveAccessSshIdentity(config) {
|
|
|
20
78
|
if (config.accessKind === "paradi-gateway") {
|
|
21
79
|
const mode = getPinnedParadiAuth(config) ??
|
|
22
80
|
(config.accessParadiAuth === "compound" ? "compound" : "slash");
|
|
23
|
-
const params = resolveParadiConnectParams(config, mode);
|
|
81
|
+
const params = resolveParadiConnectParams(config, mode, config.targetHost ?? paradiProbeHost(config));
|
|
24
82
|
return {
|
|
25
83
|
host: params.host,
|
|
26
84
|
port: params.port,
|
|
@@ -42,48 +100,69 @@ function firstDefined(...values) {
|
|
|
42
100
|
}
|
|
43
101
|
return undefined;
|
|
44
102
|
}
|
|
103
|
+
function fieldString(value) {
|
|
104
|
+
if (value == null) {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
const text = String(value).trim();
|
|
108
|
+
return text || undefined;
|
|
109
|
+
}
|
|
110
|
+
export function parseProcessTimeouts(env = process.env) {
|
|
111
|
+
const defaultTimeoutMs = Number(env.DEFAULT_TIMEOUT_MS ?? "60000");
|
|
112
|
+
const maxOutputChars = Number(env.MAX_OUTPUT_CHARS ?? "65536");
|
|
113
|
+
if (!Number.isFinite(defaultTimeoutMs) || defaultTimeoutMs <= 0) {
|
|
114
|
+
throw new Error("DEFAULT_TIMEOUT_MS must be a positive number");
|
|
115
|
+
}
|
|
116
|
+
if (!Number.isFinite(maxOutputChars) || maxOutputChars <= 0) {
|
|
117
|
+
throw new Error("MAX_OUTPUT_CHARS must be a positive number");
|
|
118
|
+
}
|
|
119
|
+
return { defaultTimeoutMs, maxOutputChars };
|
|
120
|
+
}
|
|
45
121
|
/**
|
|
46
|
-
* Load MCP config
|
|
122
|
+
* Load MCP config from GUIDE §2 fields (env or one YAML link).
|
|
47
123
|
* Legacy BASTION_* / REMOTE_SSH_* aliases were removed in 4.0.0.
|
|
48
124
|
*/
|
|
49
|
-
export function
|
|
50
|
-
|
|
51
|
-
|
|
125
|
+
export function loadConfigFromInput(input) {
|
|
126
|
+
if (fieldString(input.TARGET_HOST)) {
|
|
127
|
+
throw new Error("TARGET_HOST was removed; use TARGET_HOSTS (comma-separated list)");
|
|
128
|
+
}
|
|
129
|
+
const kindRaw = (fieldString(input.ACCESS_KIND) || "ssh").toLowerCase();
|
|
52
130
|
if (kindRaw !== "ssh" && kindRaw !== "paradi-gateway") {
|
|
53
|
-
throw new Error(`ACCESS_KIND must be "ssh" or "paradi-gateway" (got "${
|
|
131
|
+
throw new Error(`ACCESS_KIND must be "ssh" or "paradi-gateway" (got "${input.ACCESS_KIND}")`);
|
|
54
132
|
}
|
|
55
133
|
const accessKind = kindRaw;
|
|
56
|
-
const accessHost =
|
|
57
|
-
const accessUser =
|
|
134
|
+
const accessHost = fieldString(input.ACCESS_HOST);
|
|
135
|
+
const accessUser = fieldString(input.ACCESS_USER);
|
|
58
136
|
if (!accessHost) {
|
|
59
137
|
throw new Error("ACCESS_HOST is required");
|
|
60
138
|
}
|
|
61
139
|
if (!accessUser) {
|
|
62
140
|
throw new Error("ACCESS_USER is required");
|
|
63
141
|
}
|
|
64
|
-
const port = Number(
|
|
142
|
+
const port = Number(input.ACCESS_PORT ?? "22");
|
|
65
143
|
if (!Number.isFinite(port) || port <= 0) {
|
|
66
144
|
throw new Error("ACCESS_PORT must be a positive number");
|
|
67
145
|
}
|
|
68
|
-
const
|
|
69
|
-
const
|
|
146
|
+
const targetHosts = parseTargetHostField(input.TARGET_HOSTS);
|
|
147
|
+
const targetHost = defaultTargetHost(targetHosts);
|
|
148
|
+
const targetUser = fieldString(input.TARGET_USER);
|
|
70
149
|
// TARGET_PASSWORD ignored for paradi default auth (gateway password is ACCESS_PASSWORD)
|
|
71
150
|
const targetPassword = accessKind === "paradi-gateway"
|
|
72
151
|
? undefined
|
|
73
|
-
:
|
|
152
|
+
: input.TARGET_PASSWORD || undefined;
|
|
74
153
|
if (accessKind === "paradi-gateway") {
|
|
75
|
-
if (!
|
|
76
|
-
throw new Error("ACCESS_KIND=paradi-gateway requires
|
|
154
|
+
if (!targetUser) {
|
|
155
|
+
throw new Error("ACCESS_KIND=paradi-gateway requires TARGET_USER (TARGET_HOSTS may be one or more hosts)");
|
|
77
156
|
}
|
|
78
157
|
}
|
|
79
|
-
else if (
|
|
80
|
-
throw new Error("
|
|
158
|
+
else if (targetHosts.length > 0 && !targetUser) {
|
|
159
|
+
throw new Error("TARGET_HOSTS is set but TARGET_USER is missing (do not fallback to ACCESS_USER)");
|
|
81
160
|
}
|
|
82
161
|
const accessParadiAuth = accessKind === "paradi-gateway"
|
|
83
|
-
? parseParadiAuthSetting(
|
|
162
|
+
? parseParadiAuthSetting(fieldString(input.ACCESS_PARADI_AUTH))
|
|
84
163
|
: undefined;
|
|
85
|
-
const defaultTimeoutMs = Number(
|
|
86
|
-
const maxOutputChars = Number(
|
|
164
|
+
const defaultTimeoutMs = Number(input.DEFAULT_TIMEOUT_MS ?? "60000");
|
|
165
|
+
const maxOutputChars = Number(input.MAX_OUTPUT_CHARS ?? "65536");
|
|
87
166
|
if (!Number.isFinite(defaultTimeoutMs) || defaultTimeoutMs <= 0) {
|
|
88
167
|
throw new Error("DEFAULT_TIMEOUT_MS must be a positive number");
|
|
89
168
|
}
|
|
@@ -95,17 +174,42 @@ export function loadConfig(env = process.env) {
|
|
|
95
174
|
accessHost,
|
|
96
175
|
accessUser,
|
|
97
176
|
accessPort: port,
|
|
98
|
-
accessPrivateKeyPath:
|
|
99
|
-
accessPassword:
|
|
177
|
+
accessPrivateKeyPath: fieldString(input.ACCESS_PRIVATE_KEY_PATH),
|
|
178
|
+
accessPassword: input.ACCESS_PASSWORD || undefined,
|
|
100
179
|
accessParadiAuth,
|
|
180
|
+
targetHosts: targetHosts.length > 0 ? targetHosts : undefined,
|
|
101
181
|
targetHost,
|
|
102
182
|
targetUser,
|
|
103
183
|
targetPassword,
|
|
104
184
|
defaultTimeoutMs,
|
|
105
185
|
maxOutputChars,
|
|
106
|
-
allowedNamespaces: parseAllowedNamespaces(firstDefined(
|
|
186
|
+
allowedNamespaces: parseAllowedNamespaces(firstDefined(fieldString(input.ACCESS_POLICY_ALLOWED_NAMESPACES), fieldString(input.ALLOWED_NAMESPACES))),
|
|
107
187
|
};
|
|
108
188
|
}
|
|
189
|
+
/**
|
|
190
|
+
* Load MCP config. Only ACCESS_* / TARGET_* (and policy ALLOWED_NAMESPACES).
|
|
191
|
+
* Legacy BASTION_* / REMOTE_SSH_* aliases were removed in 4.0.0.
|
|
192
|
+
*/
|
|
193
|
+
export function loadConfig(env = process.env) {
|
|
194
|
+
rejectRemovedEnvAliases(env);
|
|
195
|
+
return loadConfigFromInput({
|
|
196
|
+
ACCESS_KIND: env.ACCESS_KIND,
|
|
197
|
+
ACCESS_HOST: env.ACCESS_HOST,
|
|
198
|
+
ACCESS_USER: env.ACCESS_USER,
|
|
199
|
+
ACCESS_PORT: env.ACCESS_PORT,
|
|
200
|
+
ACCESS_PRIVATE_KEY_PATH: env.ACCESS_PRIVATE_KEY_PATH,
|
|
201
|
+
ACCESS_PASSWORD: env.ACCESS_PASSWORD,
|
|
202
|
+
ACCESS_PARADI_AUTH: env.ACCESS_PARADI_AUTH,
|
|
203
|
+
TARGET_HOSTS: env.TARGET_HOSTS,
|
|
204
|
+
TARGET_HOST: env.TARGET_HOST,
|
|
205
|
+
TARGET_USER: env.TARGET_USER,
|
|
206
|
+
TARGET_PASSWORD: env.TARGET_PASSWORD,
|
|
207
|
+
DEFAULT_TIMEOUT_MS: env.DEFAULT_TIMEOUT_MS,
|
|
208
|
+
MAX_OUTPUT_CHARS: env.MAX_OUTPUT_CHARS,
|
|
209
|
+
ALLOWED_NAMESPACES: env.ALLOWED_NAMESPACES,
|
|
210
|
+
ACCESS_POLICY_ALLOWED_NAMESPACES: env.ACCESS_POLICY_ALLOWED_NAMESPACES,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
109
213
|
/** Fail fast with rename hints when removed env names are still set. */
|
|
110
214
|
function rejectRemovedEnvAliases(env) {
|
|
111
215
|
const removed = [
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,GAE3B,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
-
import {
|
|
3
|
+
import { resolveConfigSource } from "./config-yaml.js";
|
|
4
4
|
import { createServer } from "./server.js";
|
|
5
5
|
async function main() {
|
|
6
|
-
const
|
|
7
|
-
const server = createServer(
|
|
6
|
+
const source = resolveConfigSource();
|
|
7
|
+
const server = createServer(source);
|
|
8
8
|
const transport = new StdioServerTransport();
|
|
9
9
|
process.on("SIGINT", () => {
|
|
10
10
|
process.exit(0);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,KAAK,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/instructions.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import type { AppConfig } from "./config.js";
|
|
2
|
-
|
|
2
|
+
import { type ConfigSource } from "./config-yaml.js";
|
|
3
|
+
/** TARGET_* default hop-2 / Paradi auth so agents omit configured defaults instead of asking the human. */
|
|
3
4
|
export declare function buildDerivedHostAuthGuidance(config: AppConfig): string;
|
|
4
5
|
export declare function buildServerInstructions(config: AppConfig): string;
|
|
6
|
+
export declare function buildYamlRosterGuidance(linkCount: number): string;
|
|
7
|
+
export declare function buildSourceInstructions(source: ConfigSource): string;
|