@aristanetworks/eos-mcp-server 0.6.1-beta

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 (170) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/LICENSE +203 -0
  3. package/README.md +652 -0
  4. package/dist/cli.d.ts +16 -0
  5. package/dist/cli.js +188 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/printServerInfo.d.ts +2 -0
  8. package/dist/commands/printServerInfo.js +14 -0
  9. package/dist/commands/printServerInfo.js.map +1 -0
  10. package/dist/commands/probe.d.ts +2 -0
  11. package/dist/commands/probe.js +26 -0
  12. package/dist/commands/probe.js.map +1 -0
  13. package/dist/commands/validateInventory.d.ts +9 -0
  14. package/dist/commands/validateInventory.js +59 -0
  15. package/dist/commands/validateInventory.js.map +1 -0
  16. package/dist/config/loadConfig.d.ts +3 -0
  17. package/dist/config/loadConfig.js +84 -0
  18. package/dist/config/loadConfig.js.map +1 -0
  19. package/dist/config/schema.d.ts +151 -0
  20. package/dist/config/schema.js +54 -0
  21. package/dist/config/schema.js.map +1 -0
  22. package/dist/configuration/getRunningConfig.d.ts +24 -0
  23. package/dist/configuration/getRunningConfig.js +38 -0
  24. package/dist/configuration/getRunningConfig.js.map +1 -0
  25. package/dist/connection/eosDeviceReader.d.ts +18 -0
  26. package/dist/connection/eosDeviceReader.js +13 -0
  27. package/dist/connection/eosDeviceReader.js.map +1 -0
  28. package/dist/connection/resolveConnection.d.ts +4 -0
  29. package/dist/connection/resolveConnection.js +58 -0
  30. package/dist/connection/resolveConnection.js.map +1 -0
  31. package/dist/connection/validateStartupConnections.d.ts +4 -0
  32. package/dist/connection/validateStartupConnections.js +28 -0
  33. package/dist/connection/validateStartupConnections.js.map +1 -0
  34. package/dist/core/errors.d.ts +8 -0
  35. package/dist/core/errors.js +22 -0
  36. package/dist/core/errors.js.map +1 -0
  37. package/dist/core/version.d.ts +2 -0
  38. package/dist/core/version.js +7 -0
  39. package/dist/core/version.js.map +1 -0
  40. package/dist/eapi/client.d.ts +8 -0
  41. package/dist/eapi/client.js +159 -0
  42. package/dist/eapi/client.js.map +1 -0
  43. package/dist/eapi/commands.d.ts +2 -0
  44. package/dist/eapi/commands.js +25 -0
  45. package/dist/eapi/commands.js.map +1 -0
  46. package/dist/eapi/transport.d.ts +21 -0
  47. package/dist/eapi/transport.js +143 -0
  48. package/dist/eapi/transport.js.map +1 -0
  49. package/dist/eapi/types.d.ts +49 -0
  50. package/dist/eapi/types.js +15 -0
  51. package/dist/eapi/types.js.map +1 -0
  52. package/dist/facts/getFacts.d.ts +33 -0
  53. package/dist/facts/getFacts.js +50 -0
  54. package/dist/facts/getFacts.js.map +1 -0
  55. package/dist/index.d.ts +2 -0
  56. package/dist/index.js +66 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/inventory/buildModel.d.ts +3 -0
  59. package/dist/inventory/buildModel.js +79 -0
  60. package/dist/inventory/buildModel.js.map +1 -0
  61. package/dist/inventory/effectiveVars.d.ts +2 -0
  62. package/dist/inventory/effectiveVars.js +52 -0
  63. package/dist/inventory/effectiveVars.js.map +1 -0
  64. package/dist/inventory/graph.d.ts +6 -0
  65. package/dist/inventory/graph.js +81 -0
  66. package/dist/inventory/graph.js.map +1 -0
  67. package/dist/inventory/internalTypes.d.ts +17 -0
  68. package/dist/inventory/internalTypes.js +2 -0
  69. package/dist/inventory/internalTypes.js.map +1 -0
  70. package/dist/inventory/internalUtils.d.ts +10 -0
  71. package/dist/inventory/internalUtils.js +68 -0
  72. package/dist/inventory/internalUtils.js.map +1 -0
  73. package/dist/inventory/listInventoryView.d.ts +23 -0
  74. package/dist/inventory/listInventoryView.js +22 -0
  75. package/dist/inventory/listInventoryView.js.map +1 -0
  76. package/dist/inventory/loadInventory.d.ts +4 -0
  77. package/dist/inventory/loadInventory.js +87 -0
  78. package/dist/inventory/loadInventory.js.map +1 -0
  79. package/dist/inventory/normalize.d.ts +4 -0
  80. package/dist/inventory/normalize.js +251 -0
  81. package/dist/inventory/normalize.js.map +1 -0
  82. package/dist/inventory/parse.d.ts +6 -0
  83. package/dist/inventory/parse.js +31 -0
  84. package/dist/inventory/parse.js.map +1 -0
  85. package/dist/inventory/policy.d.ts +11 -0
  86. package/dist/inventory/policy.js +27 -0
  87. package/dist/inventory/policy.js.map +1 -0
  88. package/dist/inventory/resolveTarget.d.ts +14 -0
  89. package/dist/inventory/resolveTarget.js +55 -0
  90. package/dist/inventory/resolveTarget.js.map +1 -0
  91. package/dist/inventory/types.d.ts +50 -0
  92. package/dist/inventory/types.js +2 -0
  93. package/dist/inventory/types.js.map +1 -0
  94. package/dist/inventory/validateNormalized.d.ts +2 -0
  95. package/dist/inventory/validateNormalized.js +64 -0
  96. package/dist/inventory/validateNormalized.js.map +1 -0
  97. package/dist/inventory/varValidation.d.ts +2 -0
  98. package/dist/inventory/varValidation.js +60 -0
  99. package/dist/inventory/varValidation.js.map +1 -0
  100. package/dist/inventory/writePolicy.d.ts +2 -0
  101. package/dist/inventory/writePolicy.js +36 -0
  102. package/dist/inventory/writePolicy.js.map +1 -0
  103. package/dist/logging/loggingQuery.d.ts +15 -0
  104. package/dist/logging/loggingQuery.js +38 -0
  105. package/dist/logging/loggingQuery.js.map +1 -0
  106. package/dist/logging/showLogging.d.ts +28 -0
  107. package/dist/logging/showLogging.js +37 -0
  108. package/dist/logging/showLogging.js.map +1 -0
  109. package/dist/mcp/createServer.d.ts +3 -0
  110. package/dist/mcp/createServer.js +82 -0
  111. package/dist/mcp/createServer.js.map +1 -0
  112. package/dist/mcp/toolResult.d.ts +7 -0
  113. package/dist/mcp/toolResult.js +13 -0
  114. package/dist/mcp/toolResult.js.map +1 -0
  115. package/dist/mcp/tools/getFacts.d.ts +21 -0
  116. package/dist/mcp/tools/getFacts.js +17 -0
  117. package/dist/mcp/tools/getFacts.js.map +1 -0
  118. package/dist/mcp/tools/getRunningConfig.d.ts +21 -0
  119. package/dist/mcp/tools/getRunningConfig.js +17 -0
  120. package/dist/mcp/tools/getRunningConfig.js.map +1 -0
  121. package/dist/mcp/tools/getServerInfo.d.ts +10 -0
  122. package/dist/mcp/tools/getServerInfo.js +9 -0
  123. package/dist/mcp/tools/getServerInfo.js.map +1 -0
  124. package/dist/mcp/tools/listInventory.d.ts +16 -0
  125. package/dist/mcp/tools/listInventory.js +15 -0
  126. package/dist/mcp/tools/listInventory.js.map +1 -0
  127. package/dist/mcp/tools/probeDevices.d.ts +21 -0
  128. package/dist/mcp/tools/probeDevices.js +14 -0
  129. package/dist/mcp/tools/probeDevices.js.map +1 -0
  130. package/dist/mcp/tools/runShow.d.ts +30 -0
  131. package/dist/mcp/tools/runShow.js +34 -0
  132. package/dist/mcp/tools/runShow.js.map +1 -0
  133. package/dist/mcp/tools/showLogging.d.ts +24 -0
  134. package/dist/mcp/tools/showLogging.js +20 -0
  135. package/dist/mcp/tools/showLogging.js.map +1 -0
  136. package/dist/operations/readExecution.d.ts +57 -0
  137. package/dist/operations/readExecution.js +132 -0
  138. package/dist/operations/readExecution.js.map +1 -0
  139. package/dist/probe/probeDevices.d.ts +24 -0
  140. package/dist/probe/probeDevices.js +24 -0
  141. package/dist/probe/probeDevices.js.map +1 -0
  142. package/dist/serverInfo/buildServerInfo.d.ts +2 -0
  143. package/dist/serverInfo/buildServerInfo.js +49 -0
  144. package/dist/serverInfo/buildServerInfo.js.map +1 -0
  145. package/dist/serverInfo/types.d.ts +46 -0
  146. package/dist/serverInfo/types.js +2 -0
  147. package/dist/serverInfo/types.js.map +1 -0
  148. package/dist/show/runShow.d.ts +29 -0
  149. package/dist/show/runShow.js +40 -0
  150. package/dist/show/runShow.js.map +1 -0
  151. package/dist/utils/json.d.ts +1 -0
  152. package/dist/utils/json.js +4 -0
  153. package/dist/utils/json.js.map +1 -0
  154. package/dist/utils/path.d.ts +2 -0
  155. package/dist/utils/path.js +14 -0
  156. package/dist/utils/path.js.map +1 -0
  157. package/dist/utils/value.d.ts +6 -0
  158. package/dist/utils/value.js +28 -0
  159. package/dist/utils/value.js.map +1 -0
  160. package/docs/CHECKPOINT.md +46 -0
  161. package/docs/CODE_WALKTHROUGH.md +112 -0
  162. package/docs/DESIGN.md +56 -0
  163. package/docs/DEVELOPMENT.md +72 -0
  164. package/docs/EXAMPLES.md +178 -0
  165. package/docs/IMPLEMENTATION_PLAN.md +32 -0
  166. package/docs/QUICKSTART.md +152 -0
  167. package/example-inventories/canonical-fabric.yaml +45 -0
  168. package/example-inventories/multi-password.yaml +35 -0
  169. package/example-inventories/simplified-lab.yaml +33 -0
  170. package/package.json +57 -0
package/dist/cli.js ADDED
@@ -0,0 +1,188 @@
1
+ import { AppError } from "./core/errors.js";
2
+ import { APP_NAME, APP_VERSION } from "./core/version.js";
3
+ const COMMAND_NAMES = new Set(["serve", "validate-inventory", "print-server-info", "probe"]);
4
+ const OPTION_NAMES = new Set([
5
+ "--help",
6
+ "-h",
7
+ "--version",
8
+ "-V",
9
+ "--config",
10
+ "--inventory",
11
+ "--actor",
12
+ "--json",
13
+ "--inventory-only",
14
+ "--target"
15
+ ]);
16
+ const COMMAND_OPTIONS = {
17
+ "serve": new Set([
18
+ "--help",
19
+ "-h",
20
+ "--version",
21
+ "-V",
22
+ "--config",
23
+ "--inventory",
24
+ "--actor"
25
+ ]),
26
+ "validate-inventory": new Set(["--help", "-h", "--version", "-V", "--config", "--inventory", "--inventory-only", "--json"]),
27
+ "print-server-info": new Set(["--help", "-h", "--version", "-V", "--config", "--inventory", "--json"]),
28
+ "probe": new Set(["--help", "-h", "--version", "-V", "--config", "--inventory", "--target", "--json"])
29
+ };
30
+ export function parseCliArgs(argv) {
31
+ let command = "serve";
32
+ let index = 0;
33
+ const first = argv[0];
34
+ if (first === "--help" || first === "-h") {
35
+ return { command, help: true };
36
+ }
37
+ if (first === "--version" || first === "-V") {
38
+ return { command, version: true };
39
+ }
40
+ let explicitCommand = false;
41
+ if (first !== undefined && COMMAND_NAMES.has(first)) {
42
+ command = first;
43
+ explicitCommand = true;
44
+ index = 1;
45
+ }
46
+ const options = { command, ...(explicitCommand ? { explicitCommand: true } : {}) };
47
+ while (index < argv.length) {
48
+ const arg = argv[index];
49
+ if (arg !== undefined && OPTION_NAMES.has(arg)) {
50
+ assertOptionAllowed(command, arg);
51
+ }
52
+ switch (arg) {
53
+ case "--help":
54
+ case "-h":
55
+ options.help = true;
56
+ return options;
57
+ case "--version":
58
+ case "-V":
59
+ options.version = true;
60
+ return options;
61
+ case "--config": {
62
+ const value = argv[index + 1];
63
+ if (!value) {
64
+ throw new AppError("cli_missing_value", "Missing value for --config");
65
+ }
66
+ options.configPath = value;
67
+ index += 2;
68
+ break;
69
+ }
70
+ case "--inventory": {
71
+ const value = argv[index + 1];
72
+ if (!value) {
73
+ throw new AppError("cli_missing_value", "Missing value for --inventory");
74
+ }
75
+ options.inventoryPath = value;
76
+ index += 2;
77
+ break;
78
+ }
79
+ case "--actor": {
80
+ const value = argv[index + 1];
81
+ if (!value) {
82
+ throw new AppError("cli_missing_value", "Missing value for --actor");
83
+ }
84
+ options.actor = value;
85
+ index += 2;
86
+ break;
87
+ }
88
+ case "--json":
89
+ options.json = true;
90
+ index += 1;
91
+ break;
92
+ case "--inventory-only":
93
+ options.inventoryOnly = true;
94
+ index += 1;
95
+ break;
96
+ case "--target": {
97
+ const value = argv[index + 1];
98
+ if (!value) {
99
+ throw new AppError("cli_missing_value", "Missing value for --target");
100
+ }
101
+ options.target = value;
102
+ index += 2;
103
+ break;
104
+ }
105
+ default:
106
+ throw new AppError("cli_unknown_argument", `Unknown argument: ${arg}`);
107
+ }
108
+ }
109
+ return options;
110
+ }
111
+ function assertOptionAllowed(command, option) {
112
+ if (!COMMAND_OPTIONS[command].has(option)) {
113
+ throw new AppError("cli_option_not_allowed", `Option ${option} is not valid for command ${command}`);
114
+ }
115
+ }
116
+ const VERSION_BANNER = `${APP_NAME} v${APP_VERSION}`;
117
+ const HELP_TOP = `${VERSION_BANNER}
118
+ MCP server for Arista EOS eAPI (JSON-RPC over HTTPS)
119
+
120
+ Usage: ${APP_NAME} [command] [options]
121
+
122
+ Commands:
123
+ serve Start the MCP server over stdio (default)
124
+ validate-inventory Validate an inventory file
125
+ print-server-info Print server runtime/config summary
126
+ probe Probe device readiness for a target
127
+
128
+ Global options:
129
+ --config <path> Path to server config YAML file
130
+ --inventory <path> Path to inventory YAML file
131
+ -h, --help Show this help message
132
+ -V, --version Show version number
133
+
134
+ Run '${APP_NAME} <command> --help' for command-specific options.`;
135
+ const HELP_SERVE = `Usage: ${APP_NAME} serve [options]
136
+
137
+ Start the MCP server over stdio.
138
+
139
+ Options:
140
+ --config <path> Path to server config YAML file
141
+ --inventory <path> Path to inventory YAML file
142
+ --actor <name> Actor label for audit logging
143
+ -h, --help Show this help message`;
144
+ const HELP_VALIDATE_INVENTORY = `Usage: ${APP_NAME} validate-inventory [options]
145
+
146
+ Validate an inventory file. Performs structural parsing, effective
147
+ inventory validation, and startup-style connection checks by default.
148
+
149
+ Options:
150
+ --config <path> Path to server config YAML file
151
+ --inventory <path> Path to inventory YAML file
152
+ --inventory-only Skip startup connection checks
153
+ --json Output results as JSON
154
+ -h, --help Show this help message`;
155
+ const HELP_PRINT_SERVER_INFO = `Usage: ${APP_NAME} print-server-info [options]
156
+
157
+ Print a sanitized summary of server runtime configuration.
158
+
159
+ Options:
160
+ --config <path> Path to server config YAML file
161
+ --inventory <path> Path to inventory YAML file
162
+ --json Output as JSON
163
+ -h, --help Show this help message`;
164
+ const HELP_PROBE = `Usage: ${APP_NAME} probe [options]
165
+
166
+ Probe device readiness for a host or group target. Tests connectivity,
167
+ authentication, and harmless command execution.
168
+
169
+ Options:
170
+ --config <path> Path to server config YAML file
171
+ --inventory <path> Path to inventory YAML file
172
+ --target <name> Host or group name to probe (required)
173
+ --json Output as JSON
174
+ -h, --help Show this help message`;
175
+ const COMMAND_HELP = {
176
+ "serve": HELP_SERVE,
177
+ "validate-inventory": HELP_VALIDATE_INVENTORY,
178
+ "print-server-info": HELP_PRINT_SERVER_INFO,
179
+ "probe": HELP_PROBE
180
+ };
181
+ export function printHelp(cli) {
182
+ const helpText = cli.explicitCommand ? COMMAND_HELP[cli.command] : HELP_TOP;
183
+ console.log(helpText);
184
+ }
185
+ export function printVersion() {
186
+ console.log(VERSION_BANNER);
187
+ }
188
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ServerRuntimeContext } from "../serverInfo/types.js";
2
+ export declare function printServerInfo(runtimeContext: ServerRuntimeContext, asJson: boolean): void;
@@ -0,0 +1,14 @@
1
+ import { buildServerInfo } from "../serverInfo/buildServerInfo.js";
2
+ import { prettyJson } from "../utils/json.js";
3
+ export function printServerInfo(runtimeContext, asJson) {
4
+ const info = buildServerInfo(runtimeContext);
5
+ if (asJson) {
6
+ console.log(prettyJson(info));
7
+ return;
8
+ }
9
+ console.log(`Server: ${info.server_name} ${info.server_version}`);
10
+ console.log(`Mode: ${info.runtime_mode}`);
11
+ console.log(`Inventory: ${info.inventory.basename ?? "(none)"}`);
12
+ console.log(`Read timeout (ms): ${info.limits.read_timeout_ms}`);
13
+ }
14
+ //# sourceMappingURL=printServerInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"printServerInfo.js","sourceRoot":"","sources":["../../src/commands/printServerInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,UAAU,eAAe,CAAC,cAAoC,EAAE,MAAe;IACnF,MAAM,IAAI,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;IAE7C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,QAAQ,EAAE,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ResolvedServerConfig } from "../config/schema.js";
2
+ export declare function runProbe(config: ResolvedServerConfig, target: string, asJson: boolean): Promise<number>;
@@ -0,0 +1,26 @@
1
+ import { EapiDeviceReader } from "../connection/eosDeviceReader.js";
2
+ import { EapiClient } from "../eapi/client.js";
3
+ import { loadInventoryModel } from "../inventory/loadInventory.js";
4
+ import { probeDevices } from "../probe/probeDevices.js";
5
+ import { AppError } from "../core/errors.js";
6
+ import { prettyJson } from "../utils/json.js";
7
+ export async function runProbe(config, target, asJson) {
8
+ if (!config.inventoryPath) {
9
+ throw new AppError("cli_missing_inventory", "probe requires an inventory path via --inventory or config file");
10
+ }
11
+ const model = await loadInventoryModel(config.inventoryPath);
12
+ const result = await probeDevices(model, config, { target, include_raw: false }, new EapiDeviceReader(config, new EapiClient()));
13
+ if (asJson) {
14
+ console.log(prettyJson(result));
15
+ }
16
+ else {
17
+ console.log(`Probe target: ${result.target}`);
18
+ console.log(`Devices: ${result.summary.success_count}/${result.summary.total_count} succeeded`);
19
+ for (const entry of result.results) {
20
+ const suffix = entry.status === "success" ? "" : ` - ${entry.message ?? entry.error_code ?? "failed"}`;
21
+ console.log(`- ${entry.inventory_hostname}: ${entry.status}${suffix}`);
22
+ }
23
+ }
24
+ return result.summary.failed_count === 0 ? 0 : 1;
25
+ }
26
+ //# sourceMappingURL=probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/commands/probe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAA4B,EAAE,MAAc,EAAE,MAAe;IAC1F,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,IAAI,QAAQ,CAAC,uBAAuB,EAAE,iEAAiE,CAAC,CAAC;IACjH,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL,MAAM,EACN,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,EAC9B,IAAI,gBAAgB,CAAC,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC,CAC/C,CAAC;IAEF,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,YAAY,CAAC,CAAC;QAEhG,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,UAAU,IAAI,QAAQ,EAAE,CAAC;YACvG,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,kBAAkB,KAAK,KAAK,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ResolvedServerConfig } from "../config/schema.js";
2
+ import type { InventoryValidationResult } from "../inventory/types.js";
3
+ export declare function buildValidateInventoryResult(config: ResolvedServerConfig, options: {
4
+ inventoryOnly: boolean;
5
+ }): Promise<InventoryValidationResult>;
6
+ export declare function runValidateInventory(config: ResolvedServerConfig, options: {
7
+ asJson: boolean;
8
+ inventoryOnly: boolean;
9
+ }): Promise<number>;
@@ -0,0 +1,59 @@
1
+ import { AppError } from "../core/errors.js";
2
+ import { collectStartupConnectionValidationErrors } from "../connection/validateStartupConnections.js";
3
+ import { loadInventoryModel, validateInventory } from "../inventory/loadInventory.js";
4
+ import { prettyJson } from "../utils/json.js";
5
+ export async function buildValidateInventoryResult(config, options) {
6
+ if (!config.inventoryPath) {
7
+ throw new AppError("inventory_path_missing", "validate-inventory requires an inventory path via --inventory or config file");
8
+ }
9
+ const inventoryPath = config.inventoryPath;
10
+ const inventoryResult = await validateInventory(inventoryPath);
11
+ if (!inventoryResult.ok) {
12
+ return {
13
+ ...inventoryResult,
14
+ notes: options.inventoryOnly
15
+ ? [...inventoryResult.notes, "Inventory-only mode skips startup connection validation."]
16
+ : [...inventoryResult.notes, "Effective validation stopped before startup connection checks due to inventory errors."]
17
+ };
18
+ }
19
+ if (options.inventoryOnly) {
20
+ return {
21
+ ...inventoryResult,
22
+ notes: [...inventoryResult.notes, "Inventory-only mode skips startup connection validation."]
23
+ };
24
+ }
25
+ const model = await loadInventoryModel(inventoryPath);
26
+ const startupErrors = collectStartupConnectionValidationErrors(config, model);
27
+ return {
28
+ ...inventoryResult,
29
+ ok: startupErrors.length === 0,
30
+ errors: [...inventoryResult.errors, ...startupErrors],
31
+ notes: [...inventoryResult.notes, "Effective validation included startup connection checks for EOS-eligible hosts."]
32
+ };
33
+ }
34
+ export async function runValidateInventory(config, options) {
35
+ const result = await buildValidateInventoryResult(config, { inventoryOnly: options.inventoryOnly });
36
+ if (options.asJson) {
37
+ console.log(prettyJson(result));
38
+ }
39
+ else if (result.ok) {
40
+ console.log(`Inventory valid: ${result.summary?.basename ?? config.inventoryPath ?? "(unknown)"}`);
41
+ console.log(`Schema: ${result.schemaKind}`);
42
+ console.log(`Hosts: ${result.summary?.totalHostCount ?? 0}`);
43
+ console.log(`Groups: ${result.summary?.totalGroupCount ?? 0}`);
44
+ for (const note of result.notes) {
45
+ console.log(`Note: ${note}`);
46
+ }
47
+ }
48
+ else {
49
+ console.error("Inventory validation failed:");
50
+ for (const error of result.errors) {
51
+ console.error(`- [${error.code}] ${error.message}`);
52
+ }
53
+ for (const note of result.notes) {
54
+ console.error(`Note: ${note}`);
55
+ }
56
+ }
57
+ return result.ok ? 0 : 1;
58
+ }
59
+ //# sourceMappingURL=validateInventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateInventory.js","sourceRoot":"","sources":["../../src/commands/validateInventory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CliOptions } from "../cli.js";
2
+ import { type ResolvedServerConfig } from "./schema.js";
3
+ export declare function loadServerConfig(options: CliOptions): Promise<ResolvedServerConfig>;
@@ -0,0 +1,84 @@
1
+ import fs from "node:fs/promises";
2
+ import { parseDocument } from "yaml";
3
+ import { ZodError } from "zod";
4
+ import { AppError } from "../core/errors.js";
5
+ import { resolvePathFromConfig, resolvePathFromCwd } from "../utils/path.js";
6
+ import { resolvedServerConfigSchema, serverConfigFileSchema } from "./schema.js";
7
+ export async function loadServerConfig(options) {
8
+ let fileConfig = {};
9
+ let resolvedConfigPath;
10
+ if (options.configPath) {
11
+ resolvedConfigPath = resolvePathFromCwd(options.configPath);
12
+ const text = await readConfigFile(resolvedConfigPath);
13
+ const doc = parseDocument(text, { uniqueKeys: true, merge: true, prettyErrors: true });
14
+ if (doc.errors.length > 0) {
15
+ throw new AppError("config_invalid_yaml", `Invalid server config YAML: ${doc.errors.map((error) => error.message).join("; ")}`);
16
+ }
17
+ const raw = doc.toJS();
18
+ fileConfig = parseConfigSchema(() => serverConfigFileSchema.parse(raw), "config_schema_invalid");
19
+ }
20
+ const merged = {
21
+ configPath: resolvedConfigPath,
22
+ inventoryPath: resolveMaybePath(fileConfig.inventory, resolvedConfigPath),
23
+ actor: fileConfig.actor,
24
+ logFile: resolveMaybePath(fileConfig.logFile, resolvedConfigPath),
25
+ caFile: resolveMaybePath(fileConfig.caFile, resolvedConfigPath),
26
+ readTimeoutMs: fileConfig.readTimeoutMs,
27
+ overallOperationTimeoutMs: fileConfig.overallOperationTimeoutMs,
28
+ deviceConcurrency: fileConfig.deviceConcurrency,
29
+ maxReadTargets: fileConfig.maxReadTargets,
30
+ maxShowCommandsPerRequest: fileConfig.maxShowCommandsPerRequest,
31
+ maxLoggingMessagesPerRequest: fileConfig.maxLoggingMessagesPerRequest,
32
+ maxResponseSizeBytes: fileConfig.maxResponseSizeBytes,
33
+ eapiVersion: fileConfig.eapiVersion,
34
+ secretEnvPrefixes: fileConfig.secretEnvPrefixes,
35
+ defaultConnection: fileConfig.defaultConnection
36
+ };
37
+ if (options.inventoryPath) {
38
+ merged.inventoryPath = resolvePathFromCwd(options.inventoryPath);
39
+ }
40
+ if (options.actor !== undefined) {
41
+ merged.actor = options.actor;
42
+ }
43
+ return parseConfigSchema(() => resolvedServerConfigSchema.parse(merged), "config_resolved_invalid");
44
+ }
45
+ async function readConfigFile(configPath) {
46
+ try {
47
+ return await fs.readFile(configPath, "utf8");
48
+ }
49
+ catch (error) {
50
+ const message = error instanceof Error ? error.message : String(error);
51
+ throw new AppError("config_read_failed", `Failed to read server config ${configPath}: ${message}`, { configPath });
52
+ }
53
+ }
54
+ function resolveMaybePath(value, configPath) {
55
+ if (!value) {
56
+ return undefined;
57
+ }
58
+ if (!configPath) {
59
+ return resolvePathFromCwd(value);
60
+ }
61
+ return resolvePathFromConfig(configPath, value);
62
+ }
63
+ function parseConfigSchema(parse, code) {
64
+ try {
65
+ return parse();
66
+ }
67
+ catch (error) {
68
+ if (error instanceof ZodError) {
69
+ throw new AppError(code, `Invalid server config: ${formatZodIssues(error)}`, {
70
+ issues: error.issues
71
+ });
72
+ }
73
+ throw error;
74
+ }
75
+ }
76
+ function formatZodIssues(error) {
77
+ return error.issues
78
+ .map((issue) => {
79
+ const path = issue.path.length > 0 ? `${issue.path.join(".")}: ` : "";
80
+ return `${path}${issue.message}`;
81
+ })
82
+ .join("; ");
83
+ }
84
+ //# sourceMappingURL=loadConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadConfig.js","sourceRoot":"","sources":["../../src/config/loadConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAE/B,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EAGvB,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAmB;IACxD,IAAI,UAAU,GAAqB,EAAE,CAAC;IACtC,IAAI,kBAAsC,CAAC;IAE3C,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,kBAAkB,GAAG,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,kBAAkB,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvF,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE,+BAA+B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClI,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACvB,UAAU,GAAG,iBAAiB,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,uBAAuB,CAAC,CAAC;IACnG,CAAC;IAED,MAAM,MAAM,GAAG;QACb,UAAU,EAAE,kBAAkB;QAC9B,aAAa,EAAE,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,kBAAkB,CAAC;QACzE,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,OAAO,EAAE,gBAAgB,CAAC,UAAU,CAAC,OAAO,EAAE,kBAAkB,CAAC;QACjE,MAAM,EAAE,gBAAgB,CAAC,UAAU,CAAC,MAAM,EAAE,kBAAkB,CAAC;QAC/D,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,yBAAyB,EAAE,UAAU,CAAC,yBAAyB;QAC/D,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;QAC/C,cAAc,EAAE,UAAU,CAAC,cAAc;QACzC,yBAAyB,EAAE,UAAU,CAAC,yBAAyB;QAC/D,4BAA4B,EAAE,UAAU,CAAC,4BAA4B;QACrE,oBAAoB,EAAE,UAAU,CAAC,oBAAoB;QACrD,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;QAC/C,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;KAChD,CAAC;IAEF,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,CAAC,aAAa,GAAG,kBAAkB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC/B,CAAC;IAED,OAAO,iBAAiB,CAAC,GAAG,EAAE,CAAC,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,yBAAyB,CAAC,CAAC;AACtG,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,UAAkB;IAC9C,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE,gCAAgC,UAAU,KAAK,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IACrH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAyB,EAAE,UAA8B;IACjF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,qBAAqB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,iBAAiB,CAAI,KAAc,EAAE,IAAY;IACxD,IAAI,CAAC;QACH,OAAO,KAAK,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,0BAA0B,eAAe,CAAC,KAAK,CAAC,EAAE,EAAE;gBAC3E,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC,CAAC;QACL,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAe;IACtC,OAAO,KAAK,CAAC,MAAM;SAChB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,OAAO,GAAG,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IACnC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -0,0 +1,151 @@
1
+ import { z } from "zod";
2
+ export declare const serverConfigFileSchema: z.ZodObject<{
3
+ version: z.ZodOptional<z.ZodLiteral<1>>;
4
+ inventory: z.ZodOptional<z.ZodString>;
5
+ actor: z.ZodOptional<z.ZodString>;
6
+ logFile: z.ZodOptional<z.ZodString>;
7
+ caFile: z.ZodOptional<z.ZodString>;
8
+ readTimeoutMs: z.ZodOptional<z.ZodNumber>;
9
+ overallOperationTimeoutMs: z.ZodOptional<z.ZodNumber>;
10
+ deviceConcurrency: z.ZodOptional<z.ZodNumber>;
11
+ maxReadTargets: z.ZodOptional<z.ZodNumber>;
12
+ maxShowCommandsPerRequest: z.ZodOptional<z.ZodNumber>;
13
+ maxLoggingMessagesPerRequest: z.ZodOptional<z.ZodNumber>;
14
+ maxResponseSizeBytes: z.ZodOptional<z.ZodNumber>;
15
+ eapiVersion: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<1>, z.ZodLiteral<"latest">]>>;
16
+ secretEnvPrefixes: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
17
+ defaultConnection: z.ZodOptional<z.ZodObject<{
18
+ ansibleUser: z.ZodOptional<z.ZodString>;
19
+ ansibleHttpapiPort: z.ZodOptional<z.ZodNumber>;
20
+ mcpValidateCerts: z.ZodOptional<z.ZodBoolean>;
21
+ mcpPasswordEnv: z.ZodOptional<z.ZodString>;
22
+ }, "strip", z.ZodTypeAny, {
23
+ ansibleUser?: string | undefined;
24
+ ansibleHttpapiPort?: number | undefined;
25
+ mcpValidateCerts?: boolean | undefined;
26
+ mcpPasswordEnv?: string | undefined;
27
+ }, {
28
+ ansibleUser?: string | undefined;
29
+ ansibleHttpapiPort?: number | undefined;
30
+ mcpValidateCerts?: boolean | undefined;
31
+ mcpPasswordEnv?: string | undefined;
32
+ }>>;
33
+ }, "strict", z.ZodTypeAny, {
34
+ version?: 1 | undefined;
35
+ inventory?: string | undefined;
36
+ actor?: string | undefined;
37
+ logFile?: string | undefined;
38
+ caFile?: string | undefined;
39
+ readTimeoutMs?: number | undefined;
40
+ overallOperationTimeoutMs?: number | undefined;
41
+ deviceConcurrency?: number | undefined;
42
+ maxReadTargets?: number | undefined;
43
+ maxShowCommandsPerRequest?: number | undefined;
44
+ maxLoggingMessagesPerRequest?: number | undefined;
45
+ maxResponseSizeBytes?: number | undefined;
46
+ eapiVersion?: 1 | "latest" | undefined;
47
+ secretEnvPrefixes?: string[] | undefined;
48
+ defaultConnection?: {
49
+ ansibleUser?: string | undefined;
50
+ ansibleHttpapiPort?: number | undefined;
51
+ mcpValidateCerts?: boolean | undefined;
52
+ mcpPasswordEnv?: string | undefined;
53
+ } | undefined;
54
+ }, {
55
+ version?: 1 | undefined;
56
+ inventory?: string | undefined;
57
+ actor?: string | undefined;
58
+ logFile?: string | undefined;
59
+ caFile?: string | undefined;
60
+ readTimeoutMs?: number | undefined;
61
+ overallOperationTimeoutMs?: number | undefined;
62
+ deviceConcurrency?: number | undefined;
63
+ maxReadTargets?: number | undefined;
64
+ maxShowCommandsPerRequest?: number | undefined;
65
+ maxLoggingMessagesPerRequest?: number | undefined;
66
+ maxResponseSizeBytes?: number | undefined;
67
+ eapiVersion?: 1 | "latest" | undefined;
68
+ secretEnvPrefixes?: string[] | undefined;
69
+ defaultConnection?: {
70
+ ansibleUser?: string | undefined;
71
+ ansibleHttpapiPort?: number | undefined;
72
+ mcpValidateCerts?: boolean | undefined;
73
+ mcpPasswordEnv?: string | undefined;
74
+ } | undefined;
75
+ }>;
76
+ export declare const resolvedServerConfigSchema: z.ZodObject<{
77
+ configPath: z.ZodOptional<z.ZodString>;
78
+ inventoryPath: z.ZodOptional<z.ZodString>;
79
+ actor: z.ZodOptional<z.ZodString>;
80
+ logFile: z.ZodOptional<z.ZodString>;
81
+ caFile: z.ZodOptional<z.ZodString>;
82
+ readTimeoutMs: z.ZodDefault<z.ZodNumber>;
83
+ overallOperationTimeoutMs: z.ZodOptional<z.ZodNumber>;
84
+ deviceConcurrency: z.ZodDefault<z.ZodNumber>;
85
+ maxReadTargets: z.ZodDefault<z.ZodNumber>;
86
+ maxShowCommandsPerRequest: z.ZodDefault<z.ZodNumber>;
87
+ maxLoggingMessagesPerRequest: z.ZodDefault<z.ZodNumber>;
88
+ maxResponseSizeBytes: z.ZodDefault<z.ZodNumber>;
89
+ eapiVersion: z.ZodDefault<z.ZodUnion<[z.ZodLiteral<1>, z.ZodLiteral<"latest">]>>;
90
+ secretEnvPrefixes: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
91
+ defaultConnection: z.ZodDefault<z.ZodObject<{
92
+ ansibleUser: z.ZodOptional<z.ZodString>;
93
+ ansibleHttpapiPort: z.ZodOptional<z.ZodNumber>;
94
+ mcpValidateCerts: z.ZodOptional<z.ZodBoolean>;
95
+ mcpPasswordEnv: z.ZodOptional<z.ZodString>;
96
+ }, "strip", z.ZodTypeAny, {
97
+ ansibleUser?: string | undefined;
98
+ ansibleHttpapiPort?: number | undefined;
99
+ mcpValidateCerts?: boolean | undefined;
100
+ mcpPasswordEnv?: string | undefined;
101
+ }, {
102
+ ansibleUser?: string | undefined;
103
+ ansibleHttpapiPort?: number | undefined;
104
+ mcpValidateCerts?: boolean | undefined;
105
+ mcpPasswordEnv?: string | undefined;
106
+ }>>;
107
+ }, "strip", z.ZodTypeAny, {
108
+ readTimeoutMs: number;
109
+ deviceConcurrency: number;
110
+ maxReadTargets: number;
111
+ maxShowCommandsPerRequest: number;
112
+ maxLoggingMessagesPerRequest: number;
113
+ maxResponseSizeBytes: number;
114
+ eapiVersion: 1 | "latest";
115
+ secretEnvPrefixes: string[];
116
+ defaultConnection: {
117
+ ansibleUser?: string | undefined;
118
+ ansibleHttpapiPort?: number | undefined;
119
+ mcpValidateCerts?: boolean | undefined;
120
+ mcpPasswordEnv?: string | undefined;
121
+ };
122
+ actor?: string | undefined;
123
+ logFile?: string | undefined;
124
+ caFile?: string | undefined;
125
+ overallOperationTimeoutMs?: number | undefined;
126
+ configPath?: string | undefined;
127
+ inventoryPath?: string | undefined;
128
+ }, {
129
+ actor?: string | undefined;
130
+ logFile?: string | undefined;
131
+ caFile?: string | undefined;
132
+ readTimeoutMs?: number | undefined;
133
+ overallOperationTimeoutMs?: number | undefined;
134
+ deviceConcurrency?: number | undefined;
135
+ maxReadTargets?: number | undefined;
136
+ maxShowCommandsPerRequest?: number | undefined;
137
+ maxLoggingMessagesPerRequest?: number | undefined;
138
+ maxResponseSizeBytes?: number | undefined;
139
+ eapiVersion?: 1 | "latest" | undefined;
140
+ secretEnvPrefixes?: string[] | undefined;
141
+ defaultConnection?: {
142
+ ansibleUser?: string | undefined;
143
+ ansibleHttpapiPort?: number | undefined;
144
+ mcpValidateCerts?: boolean | undefined;
145
+ mcpPasswordEnv?: string | undefined;
146
+ } | undefined;
147
+ configPath?: string | undefined;
148
+ inventoryPath?: string | undefined;
149
+ }>;
150
+ export type ServerConfigFile = z.infer<typeof serverConfigFileSchema>;
151
+ export type ResolvedServerConfig = z.infer<typeof resolvedServerConfigSchema>;
@@ -0,0 +1,54 @@
1
+ import { z } from "zod";
2
+ const eapiVersionSchema = z.union([z.literal(1), z.literal("latest")]);
3
+ export const serverConfigFileSchema = z
4
+ .object({
5
+ version: z.literal(1).optional(),
6
+ inventory: z.string().min(1).optional(),
7
+ actor: z.string().min(1).optional(),
8
+ logFile: z.string().min(1).optional(),
9
+ caFile: z.string().min(1).optional(),
10
+ readTimeoutMs: z.number().int().positive().optional(),
11
+ overallOperationTimeoutMs: z.number().int().positive().optional(),
12
+ deviceConcurrency: z.number().int().positive().optional(),
13
+ maxReadTargets: z.number().int().positive().optional(),
14
+ maxShowCommandsPerRequest: z.number().int().positive().optional(),
15
+ maxLoggingMessagesPerRequest: z.number().int().positive().max(9999).optional(),
16
+ maxResponseSizeBytes: z.number().int().positive().optional(),
17
+ eapiVersion: eapiVersionSchema.optional(),
18
+ secretEnvPrefixes: z.array(z.string().min(1)).optional(),
19
+ defaultConnection: z
20
+ .object({
21
+ ansibleUser: z.string().min(1).optional(),
22
+ ansibleHttpapiPort: z.number().int().positive().optional(),
23
+ mcpValidateCerts: z.boolean().optional(),
24
+ mcpPasswordEnv: z.string().min(1).optional()
25
+ })
26
+ .optional()
27
+ })
28
+ .strict();
29
+ export const resolvedServerConfigSchema = z
30
+ .object({
31
+ configPath: z.string().min(1).optional(),
32
+ inventoryPath: z.string().min(1).optional(),
33
+ actor: z.string().min(1).optional(),
34
+ logFile: z.string().min(1).optional(),
35
+ caFile: z.string().min(1).optional(),
36
+ readTimeoutMs: z.number().int().positive().default(10_000),
37
+ overallOperationTimeoutMs: z.number().int().positive().optional(),
38
+ deviceConcurrency: z.number().int().positive().default(5),
39
+ maxReadTargets: z.number().int().positive().default(50),
40
+ maxShowCommandsPerRequest: z.number().int().positive().default(5),
41
+ maxLoggingMessagesPerRequest: z.number().int().positive().max(9999).default(1000),
42
+ maxResponseSizeBytes: z.number().int().positive().default(1_048_576),
43
+ eapiVersion: eapiVersionSchema.default("latest"),
44
+ secretEnvPrefixes: z.array(z.string().min(1)).default(["EOS_MCP_"]),
45
+ defaultConnection: z
46
+ .object({
47
+ ansibleUser: z.string().min(1).optional(),
48
+ ansibleHttpapiPort: z.number().int().positive().optional(),
49
+ mcpValidateCerts: z.boolean().optional(),
50
+ mcpPasswordEnv: z.string().min(1).optional()
51
+ })
52
+ .default({})
53
+ });
54
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}