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.
Files changed (94) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +14 -12
  3. package/SECURITY.md +3 -3
  4. package/dist/access/index.d.ts +21 -10
  5. package/dist/access/index.js +55 -27
  6. package/dist/access/index.js.map +1 -1
  7. package/dist/access/paradi-auth.d.ts +3 -3
  8. package/dist/access/paradi-auth.js +4 -4
  9. package/dist/access/paradi-auth.js.map +1 -1
  10. package/dist/access/paradi-transport.d.ts +1 -1
  11. package/dist/access/paradi-transport.js +3 -3
  12. package/dist/access/paradi-transport.js.map +1 -1
  13. package/dist/access/paradi-username.d.ts +1 -1
  14. package/dist/access/paradi-username.js +2 -2
  15. package/dist/access/paradi-username.js.map +1 -1
  16. package/dist/access/session-pool.d.ts +5 -0
  17. package/dist/access/session-pool.js +7 -0
  18. package/dist/access/session-pool.js.map +1 -1
  19. package/dist/access/ssh-transport.d.ts +1 -1
  20. package/dist/access/ssh-transport.js +3 -2
  21. package/dist/access/ssh-transport.js.map +1 -1
  22. package/dist/config-yaml.d.ts +54 -0
  23. package/dist/config-yaml.js +172 -0
  24. package/dist/config-yaml.js.map +1 -0
  25. package/dist/config.d.ts +45 -1
  26. package/dist/config.js +126 -22
  27. package/dist/config.js.map +1 -1
  28. package/dist/index.js +3 -3
  29. package/dist/index.js.map +1 -1
  30. package/dist/instructions.d.ts +4 -1
  31. package/dist/instructions.js +92 -70
  32. package/dist/instructions.js.map +1 -1
  33. package/dist/kubectl/runner.d.ts +7 -8
  34. package/dist/kubectl/runner.js +18 -21
  35. package/dist/kubectl/runner.js.map +1 -1
  36. package/dist/link-runtime.d.ts +39 -0
  37. package/dist/link-runtime.js +134 -0
  38. package/dist/link-runtime.js.map +1 -0
  39. package/dist/server.d.ts +2 -1
  40. package/dist/server.js +10 -12
  41. package/dist/server.js.map +1 -1
  42. package/dist/sources/guides.d.ts +34 -0
  43. package/dist/sources/guides.js +50 -0
  44. package/dist/sources/guides.js.map +1 -0
  45. package/dist/sources/index.d.ts +5 -0
  46. package/dist/sources/index.js +22 -0
  47. package/dist/sources/index.js.map +1 -0
  48. package/dist/sources/yaml-template.d.ts +31 -0
  49. package/dist/sources/yaml-template.js +35 -0
  50. package/dist/sources/yaml-template.js.map +1 -0
  51. package/dist/ssh/access-client.d.ts +6 -2
  52. package/dist/ssh/access-client.js +58 -27
  53. package/dist/ssh/access-client.js.map +1 -1
  54. package/dist/ssh/access-errors.js +1 -1
  55. package/dist/ssh/access-errors.js.map +1 -1
  56. package/dist/ssh/access-sftp.js +3 -3
  57. package/dist/ssh/access-sftp.js.map +1 -1
  58. package/dist/tools/copy-job-schemas.d.ts +96 -581
  59. package/dist/tools/copy-job-schemas.js +9 -9
  60. package/dist/tools/copy-job-schemas.js.map +1 -1
  61. package/dist/tools/register.d.ts +2 -10
  62. package/dist/tools/register.js +174 -331
  63. package/dist/tools/register.js.map +1 -1
  64. package/dist/tools/remote-schemas.d.ts +156 -708
  65. package/dist/tools/remote-schemas.js +99 -103
  66. package/dist/tools/remote-schemas.js.map +1 -1
  67. package/dist/utils/copy-executor.d.ts +3 -1
  68. package/dist/utils/copy-executor.js +39 -25
  69. package/dist/utils/copy-executor.js.map +1 -1
  70. package/dist/utils/copy-transfer.d.ts +2 -0
  71. package/dist/utils/copy-transfer.js.map +1 -1
  72. package/dist/utils/remote-executor.d.ts +3 -4
  73. package/dist/utils/remote-executor.js +8 -18
  74. package/dist/utils/remote-executor.js.map +1 -1
  75. package/dist/utils/remote-target.js +1 -1
  76. package/dist/utils/remote-target.js.map +1 -1
  77. package/docs/AGENT_GUIDE.md +31 -103
  78. package/docs/CONFIGURATION.md +39 -10
  79. package/docs/GUIDE.md +186 -0
  80. package/docs/PARADI_ACCESS_PLAN.md +6 -6
  81. package/docs/TODO.md +4 -11
  82. package/docs/USER_GUIDE.zh-CN.md +38 -69
  83. package/docs/host-execution.yaml +92 -0
  84. package/docs/paradi-gateway-interactive.png +0 -0
  85. package/package.json +67 -65
  86. package/dist/ssh/bastion-client.d.ts +0 -60
  87. package/dist/ssh/bastion-client.js +0 -423
  88. package/dist/ssh/bastion-client.js.map +0 -1
  89. package/dist/ssh/bastion-errors.d.ts +0 -62
  90. package/dist/ssh/bastion-errors.js +0 -190
  91. package/dist/ssh/bastion-errors.js.map +0 -1
  92. package/dist/ssh/hop1-sftp.d.ts +0 -14
  93. package/dist/ssh/hop1-sftp.js +0 -437
  94. 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;AAEzC,OAAO,EACL,eAAe,EACf,mBAAmB,GAGpB,MAAM,YAAY,CAAC;AAEpB,SAAS,kBAAkB,CAAC,IAAgB;IAC1C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrF,OAAO,MAAM,MAAM,EAAE,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IAC7B,mBAAmB,CAAC,MAAiB;QACnC,IAAI,MAAM,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,yDAAyD,MAAM,CAAC,UAAU,GAAG,CAC9E,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;QAC/B,OAAO;YACL,GAAG,EAAE,eAAe,CAAC;gBACnB,SAAS,EAAE,KAAK;gBAChB,IAAI;gBACJ,IAAI;gBACJ,IAAI,EAAE,MAAM,CAAC,UAAU;gBACvB,YAAY,EAAE,IAAI;aACnB,CAAC;YACF,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE;YACjD,YAAY,EAAE,mBAAmB,CAAC,IAAI,CAAC;SACxC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,MAA4B,EAAE,IAAgB;QAC1D,IAAI,MAAM,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,oDAAoD,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO;YACL,GAAG,EAAE,eAAe,CAAC;gBACnB,SAAS,EAAE,KAAK;gBAChB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;gBACrB,SAAS,EAAE,MAAM,CAAC,GAAG;gBACrB,YAAY,EAAE,kBAAkB,CAAC,IAAI,CAAC;aACvC,CAAC;YACF,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE;YACrE,SAAS,EAAE,MAAM,CAAC,GAAG;YACrB,YAAY,EAAE,mBAAmB,CAAC,IAAI,CAAC;SACxC,CAAC;IACJ,CAAC;IAED,qFAAqF;IACrF,iBAAiB,CAAC,MAAiB;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO;YACL,IAAI;YACJ,IAAI;YACJ,QAAQ,EAAE,MAAM,CAAC,cAAc;SAChC,CAAC;IACJ,CAAC;CACF"}
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
- /** Default derive selector (ssh only) — does not create a Context at init. */
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. Only ACCESS_* / TARGET_* (and policy ALLOWED_NAMESPACES).
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 loadConfig(env = process.env) {
50
- rejectRemovedEnvAliases(env);
51
- const kindRaw = (env.ACCESS_KIND?.trim() || "ssh").toLowerCase();
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 "${env.ACCESS_KIND}")`);
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 = env.ACCESS_HOST?.trim();
57
- const accessUser = env.ACCESS_USER?.trim();
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(env.ACCESS_PORT?.trim() || "22");
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 targetHost = env.TARGET_HOST?.trim() || undefined;
69
- const targetUser = env.TARGET_USER?.trim() || undefined;
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
- : env.TARGET_PASSWORD || undefined;
152
+ : input.TARGET_PASSWORD || undefined;
74
153
  if (accessKind === "paradi-gateway") {
75
- if (!targetHost || !targetUser) {
76
- throw new Error("ACCESS_KIND=paradi-gateway requires TARGET_HOST and TARGET_USER");
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 (targetHost && !targetUser) {
80
- throw new Error("TARGET_HOST is set but TARGET_USER is missing (do not fallback to ACCESS_USER)");
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(env.ACCESS_PARADI_AUTH)
162
+ ? parseParadiAuthSetting(fieldString(input.ACCESS_PARADI_AUTH))
84
163
  : undefined;
85
- const defaultTimeoutMs = Number(env.DEFAULT_TIMEOUT_MS ?? "60000");
86
- const maxOutputChars = Number(env.MAX_OUTPUT_CHARS ?? "65536");
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: env.ACCESS_PRIVATE_KEY_PATH?.trim() || undefined,
99
- accessPassword: env.ACCESS_PASSWORD || undefined,
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(env.ACCESS_POLICY_ALLOWED_NAMESPACES, env.ALLOWED_NAMESPACES)),
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 = [
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
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 { loadConfig } from "./config.js";
3
+ import { resolveConfigSource } from "./config-yaml.js";
4
4
  import { createServer } from "./server.js";
5
5
  async function main() {
6
- const config = loadConfig();
7
- const server = createServer(config);
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,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,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"}
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"}
@@ -1,4 +1,7 @@
1
1
  import type { AppConfig } from "./config.js";
2
- /** TARGET_* default derive auth so agents omit configured defaults instead of asking the human. */
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;