@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
@@ -0,0 +1,17 @@
1
+ import type { InventorySchemaKind, InventoryValidationError } from "./types.js";
2
+ export type InventoryVars = Record<string, unknown>;
3
+ export interface NormalizedInventory {
4
+ schemaKind: InventorySchemaKind;
5
+ globalVars: InventoryVars;
6
+ hosts: Map<string, InventoryVars>;
7
+ groups: Map<string, NormalizedGroup>;
8
+ }
9
+ export interface NormalizedGroup {
10
+ name: string;
11
+ vars: InventoryVars;
12
+ hosts: string[];
13
+ children: string[];
14
+ }
15
+ export interface ValidationContext {
16
+ errors: InventoryValidationError[];
17
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=internalTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internalTypes.js","sourceRoot":"","sources":["../../src/inventory/internalTypes.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { isObject } from "../utils/value.js";
2
+ import type { InventoryVars, ValidationContext } from "./internalTypes.js";
3
+ export declare const SIMPLIFIED_ROOT_KEYS: Set<string>;
4
+ export declare const SIMPLIFIED_GROUP_KEYS: Set<string>;
5
+ export declare const CANONICAL_GROUP_KEYS: Set<string>;
6
+ export declare function readVarsObject(value: unknown, context: ValidationContext, pathLabel: string): InventoryVars;
7
+ export declare function readStringList(value: unknown, context: ValidationContext, pathLabel: string): string[];
8
+ export declare function validateSafeName(name: string, kind: "host" | "group", context: ValidationContext, pathLabel: string): void;
9
+ export { isObject };
10
+ export declare function stableValueKey(value: unknown): string;
@@ -0,0 +1,68 @@
1
+ import { isObject } from "../utils/value.js";
2
+ const SAFE_NAME_PATTERN = /^[A-Za-z0-9_.-]+$/;
3
+ export const SIMPLIFIED_ROOT_KEYS = new Set(["version", "vars", "hosts", "groups"]);
4
+ export const SIMPLIFIED_GROUP_KEYS = new Set(["vars", "hosts", "children"]);
5
+ export const CANONICAL_GROUP_KEYS = new Set(["vars", "hosts", "children"]);
6
+ export function readVarsObject(value, context, pathLabel) {
7
+ if (value === undefined) {
8
+ return {};
9
+ }
10
+ if (!isObject(value)) {
11
+ context.errors.push({
12
+ code: "inventory_vars_invalid",
13
+ message: `${pathLabel} must be a mapping/object`,
14
+ path: pathLabel
15
+ });
16
+ return {};
17
+ }
18
+ return { ...value };
19
+ }
20
+ export function readStringList(value, context, pathLabel) {
21
+ if (value === undefined) {
22
+ return [];
23
+ }
24
+ if (!Array.isArray(value)) {
25
+ context.errors.push({
26
+ code: "inventory_list_invalid",
27
+ message: `${pathLabel} must be a list/array of strings`,
28
+ path: pathLabel
29
+ });
30
+ return [];
31
+ }
32
+ const result = [];
33
+ for (const entry of value) {
34
+ if (typeof entry !== "string") {
35
+ context.errors.push({
36
+ code: "inventory_list_entry_invalid",
37
+ message: `${pathLabel} entries must be strings`,
38
+ path: pathLabel
39
+ });
40
+ continue;
41
+ }
42
+ result.push(entry);
43
+ }
44
+ return result;
45
+ }
46
+ export function validateSafeName(name, kind, context, pathLabel) {
47
+ if (!SAFE_NAME_PATTERN.test(name)) {
48
+ context.errors.push({
49
+ code: "inventory_name_invalid",
50
+ message: `Invalid ${kind} name ${JSON.stringify(name)}; expected pattern ${SAFE_NAME_PATTERN.source}`,
51
+ path: pathLabel
52
+ });
53
+ }
54
+ }
55
+ export { isObject };
56
+ export function stableValueKey(value) {
57
+ if (Array.isArray(value)) {
58
+ return `[${value.map(stableValueKey).join(",")}]`;
59
+ }
60
+ if (isObject(value)) {
61
+ return `{${Object.keys(value)
62
+ .sort()
63
+ .map((key) => `${JSON.stringify(key)}:${stableValueKey(value[key])}`)
64
+ .join(",")}}`;
65
+ }
66
+ return JSON.stringify(value);
67
+ }
68
+ //# sourceMappingURL=internalUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internalUtils.js","sourceRoot":"","sources":["../../src/inventory/internalUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { InventoryModel } from "./types.js";
2
+ export interface ListInventoryView {
3
+ hosts: Array<{
4
+ inventory_hostname: string;
5
+ resolved_endpoint: string;
6
+ eligible: boolean;
7
+ read_allowed: boolean;
8
+ ineligibility_reasons: string[];
9
+ group_memberships: string[];
10
+ }>;
11
+ groups: Array<{
12
+ name: string;
13
+ actionable: boolean;
14
+ eligible_host_count: number;
15
+ ineligible_host_count: number;
16
+ resolved_hosts: string[];
17
+ children: string[];
18
+ }>;
19
+ }
20
+ export interface BuildListInventoryViewOptions {
21
+ includeIneligible: boolean;
22
+ }
23
+ export declare function buildListInventoryView(model: InventoryModel, options: BuildListInventoryViewOptions): ListInventoryView;
@@ -0,0 +1,22 @@
1
+ export function buildListInventoryView(model, options) {
2
+ const hosts = model.hosts
3
+ .filter((host) => options.includeIneligible || host.eligible)
4
+ .map((host) => ({
5
+ inventory_hostname: host.inventoryHostname,
6
+ resolved_endpoint: host.resolvedEndpoint,
7
+ eligible: host.eligible,
8
+ read_allowed: host.readAllowed,
9
+ ineligibility_reasons: [...host.ineligibilityReasons],
10
+ group_memberships: [...host.groupMemberships]
11
+ }));
12
+ const groups = model.groups.map((group) => ({
13
+ name: group.name,
14
+ actionable: group.actionable,
15
+ eligible_host_count: group.eligibleHostCount,
16
+ ineligible_host_count: group.ineligibleHostCount,
17
+ resolved_hosts: [...group.resolvedHosts],
18
+ children: [...group.children]
19
+ }));
20
+ return { hosts, groups };
21
+ }
22
+ //# sourceMappingURL=listInventoryView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listInventoryView.js","sourceRoot":"","sources":["../../src/inventory/listInventoryView.ts"],"names":[],"mappings":"AAyBA,MAAM,UAAU,sBAAsB,CACpC,KAAqB,EACrB,OAAsC;IAEtC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK;SACtB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,iBAAiB,IAAI,IAAI,CAAC,QAAQ,CAAC;SAC5D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACd,kBAAkB,EAAE,IAAI,CAAC,iBAAiB;QAC1C,iBAAiB,EAAE,IAAI,CAAC,gBAAgB;QACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,YAAY,EAAE,IAAI,CAAC,WAAW;QAC9B,qBAAqB,EAAE,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC;QACrD,iBAAiB,EAAE,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC;KAC9C,CAAC,CAAC,CAAC;IAEN,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,mBAAmB,EAAE,KAAK,CAAC,iBAAiB;QAC5C,qBAAqB,EAAE,KAAK,CAAC,mBAAmB;QAChD,cAAc,EAAE,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC;QACxC,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;KAC9B,CAAC,CAAC,CAAC;IAEJ,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { InventoryModel, InventorySummary, InventoryValidationResult } from "./types.js";
2
+ export declare function loadInventorySummary(inventoryPath: string): Promise<InventorySummary>;
3
+ export declare function loadInventoryModel(inventoryPath: string): Promise<InventoryModel>;
4
+ export declare function validateInventory(inventoryPath: string): Promise<InventoryValidationResult>;
@@ -0,0 +1,87 @@
1
+ import { AppError } from "../core/errors.js";
2
+ import { buildInventoryModel } from "./buildModel.js";
3
+ import { detectSchemaKind, normalizeInventory } from "./normalize.js";
4
+ import { parseInventoryDocument } from "./parse.js";
5
+ import { validateNormalizedInventory } from "./validateNormalized.js";
6
+ import { validateKnownInventoryVarTypes } from "./varValidation.js";
7
+ function buildParsedInventoryResult(result) {
8
+ return {
9
+ ...result,
10
+ notes: result.notes ?? []
11
+ };
12
+ }
13
+ function assertParsedInventorySuccess(result, value) {
14
+ if (result.errors.length > 0 || value === undefined) {
15
+ throw new AppError("inventory_validation_failed", result.errors.map((error) => error.message).join("; "));
16
+ }
17
+ return value;
18
+ }
19
+ export async function loadInventorySummary(inventoryPath) {
20
+ const result = await parseAndValidateInventory(inventoryPath);
21
+ return assertParsedInventorySuccess(result, result.summary);
22
+ }
23
+ export async function loadInventoryModel(inventoryPath) {
24
+ const result = await parseAndValidateInventory(inventoryPath);
25
+ return assertParsedInventorySuccess(result, result.model);
26
+ }
27
+ export async function validateInventory(inventoryPath) {
28
+ const result = await parseAndValidateInventory(inventoryPath);
29
+ return {
30
+ ok: result.errors.length === 0,
31
+ ...(result.schemaKind !== undefined ? { schemaKind: result.schemaKind } : {}),
32
+ ...(result.summary !== undefined ? { summary: result.summary } : {}),
33
+ errors: result.errors,
34
+ notes: result.notes
35
+ };
36
+ }
37
+ async function parseAndValidateInventory(inventoryPath) {
38
+ const parsedDocument = await parseInventoryDocument(inventoryPath);
39
+ if (parsedDocument.errors.length > 0 || parsedDocument.rootValue === undefined) {
40
+ return buildParsedInventoryResult({
41
+ errors: parsedDocument.errors
42
+ });
43
+ }
44
+ try {
45
+ const schemaKind = detectSchemaKind(parsedDocument.rootValue);
46
+ const context = { errors: [] };
47
+ const normalized = normalizeInventory(parsedDocument.rootValue, schemaKind, context);
48
+ if (!normalized) {
49
+ return buildParsedInventoryResult({
50
+ schemaKind,
51
+ errors: context.errors
52
+ });
53
+ }
54
+ validateNormalizedInventory(normalized, context);
55
+ validateKnownInventoryVarTypes(normalized, context);
56
+ if (context.errors.length > 0) {
57
+ return buildParsedInventoryResult({
58
+ schemaKind,
59
+ errors: context.errors
60
+ });
61
+ }
62
+ const model = buildInventoryModel(normalized, inventoryPath, context);
63
+ if (!model || context.errors.length > 0) {
64
+ return buildParsedInventoryResult({
65
+ schemaKind,
66
+ errors: context.errors
67
+ });
68
+ }
69
+ return buildParsedInventoryResult({
70
+ schemaKind,
71
+ summary: model.summary,
72
+ model,
73
+ errors: context.errors
74
+ });
75
+ }
76
+ catch (error) {
77
+ return buildParsedInventoryResult({
78
+ errors: [
79
+ {
80
+ code: "inventory_validation_failed",
81
+ message: error instanceof Error ? error.message : String(error)
82
+ }
83
+ ]
84
+ });
85
+ }
86
+ }
87
+ //# sourceMappingURL=loadInventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadInventory.js","sourceRoot":"","sources":["../../src/inventory/loadInventory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { InventorySchemaKind } from "./types.js";
2
+ import type { NormalizedInventory, ValidationContext } from "./internalTypes.js";
3
+ export declare function detectSchemaKind(value: unknown): InventorySchemaKind;
4
+ export declare function normalizeInventory(value: unknown, schemaKind: InventorySchemaKind, context: ValidationContext): NormalizedInventory | null;
@@ -0,0 +1,251 @@
1
+ import { AppError } from "../core/errors.js";
2
+ import { CANONICAL_GROUP_KEYS, SIMPLIFIED_GROUP_KEYS, SIMPLIFIED_ROOT_KEYS, isObject, readStringList, readVarsObject, validateSafeName } from "./internalUtils.js";
3
+ export function detectSchemaKind(value) {
4
+ if (!isObject(value)) {
5
+ throw new AppError("inventory_invalid_root", "Inventory root must be a mapping/object");
6
+ }
7
+ if ("all" in value) {
8
+ return "canonical-ansible-yaml";
9
+ }
10
+ if ("hosts" in value || "groups" in value || "vars" in value || "version" in value) {
11
+ return "simplified-yaml";
12
+ }
13
+ throw new AppError("inventory_unsupported_schema", "Unsupported inventory schema: expected canonical all: root or simplified vars/hosts/groups root");
14
+ }
15
+ export function normalizeInventory(value, schemaKind, context) {
16
+ return schemaKind === "simplified-yaml"
17
+ ? normalizeSimplifiedInventory(value, context)
18
+ : normalizeCanonicalInventory(value, context);
19
+ }
20
+ function normalizeSimplifiedInventory(value, context) {
21
+ if (!isObject(value)) {
22
+ context.errors.push({
23
+ code: "inventory_root_invalid",
24
+ message: "Simplified inventory root must be a mapping/object"
25
+ });
26
+ return null;
27
+ }
28
+ for (const key of Object.keys(value)) {
29
+ if (!SIMPLIFIED_ROOT_KEYS.has(key)) {
30
+ context.errors.push({
31
+ code: "inventory_structural_key_invalid",
32
+ message: `Unsupported top-level key in simplified inventory: ${key}`,
33
+ path: key
34
+ });
35
+ }
36
+ }
37
+ if (value.version !== undefined && value.version !== 1) {
38
+ context.errors.push({
39
+ code: "inventory_version_invalid",
40
+ message: `Unsupported simplified inventory version: ${String(value.version)}`,
41
+ path: "version"
42
+ });
43
+ }
44
+ const globalVars = readVarsObject(value.vars, context, "vars");
45
+ const hosts = new Map();
46
+ const groups = new Map();
47
+ if (value.hosts !== undefined && !isObject(value.hosts)) {
48
+ context.errors.push({
49
+ code: "inventory_hosts_invalid",
50
+ message: "Simplified inventory hosts must be a mapping/object",
51
+ path: "hosts"
52
+ });
53
+ }
54
+ if (isObject(value.hosts)) {
55
+ for (const [hostName, hostValue] of Object.entries(value.hosts)) {
56
+ validateSafeName(hostName, "host", context, `hosts.${hostName}`);
57
+ if (!isObject(hostValue)) {
58
+ context.errors.push({
59
+ code: "inventory_host_invalid",
60
+ message: `Host ${hostName} must be a mapping/object of direct host vars`,
61
+ path: `hosts.${hostName}`
62
+ });
63
+ continue;
64
+ }
65
+ hosts.set(hostName, { ...hostValue });
66
+ }
67
+ }
68
+ if (value.groups !== undefined && !isObject(value.groups)) {
69
+ context.errors.push({
70
+ code: "inventory_groups_invalid",
71
+ message: "Simplified inventory groups must be a mapping/object",
72
+ path: "groups"
73
+ });
74
+ }
75
+ if (isObject(value.groups)) {
76
+ for (const [groupName, groupValue] of Object.entries(value.groups)) {
77
+ validateSafeName(groupName, "group", context, `groups.${groupName}`);
78
+ if (groupName === "all") {
79
+ context.errors.push({
80
+ code: "inventory_group_reserved",
81
+ message: "Simplified inventory may not define groups.all; all is implicit/reserved",
82
+ path: `groups.${groupName}`
83
+ });
84
+ continue;
85
+ }
86
+ if (hosts.has(groupName)) {
87
+ context.errors.push({
88
+ code: "inventory_name_collision",
89
+ message: `Host/group name collision: ${groupName}`,
90
+ path: `groups.${groupName}`
91
+ });
92
+ }
93
+ if (!isObject(groupValue)) {
94
+ context.errors.push({
95
+ code: "inventory_group_invalid",
96
+ message: `Group ${groupName} must be a mapping/object`,
97
+ path: `groups.${groupName}`
98
+ });
99
+ continue;
100
+ }
101
+ for (const key of Object.keys(groupValue)) {
102
+ if (!SIMPLIFIED_GROUP_KEYS.has(key)) {
103
+ context.errors.push({
104
+ code: "inventory_group_structural_key_invalid",
105
+ message: `Unsupported key ${key} in simplified group ${groupName}`,
106
+ path: `groups.${groupName}.${key}`
107
+ });
108
+ }
109
+ }
110
+ groups.set(groupName, {
111
+ name: groupName,
112
+ vars: readVarsObject(groupValue.vars, context, `groups.${groupName}.vars`),
113
+ hosts: readStringList(groupValue.hosts, context, `groups.${groupName}.hosts`),
114
+ children: readStringList(groupValue.children, context, `groups.${groupName}.children`)
115
+ });
116
+ }
117
+ }
118
+ return {
119
+ schemaKind: "simplified-yaml",
120
+ globalVars,
121
+ hosts,
122
+ groups
123
+ };
124
+ }
125
+ function normalizeCanonicalInventory(value, context) {
126
+ if (!isObject(value) || !isObject(value.all)) {
127
+ context.errors.push({
128
+ code: "inventory_root_invalid",
129
+ message: "Canonical inventory must contain an all mapping/object",
130
+ path: "all"
131
+ });
132
+ return null;
133
+ }
134
+ for (const key of Object.keys(value)) {
135
+ if (key !== "all") {
136
+ context.errors.push({
137
+ code: "inventory_structural_key_invalid",
138
+ message: `Unsupported top-level key in canonical inventory: ${key}`,
139
+ path: key
140
+ });
141
+ }
142
+ }
143
+ const allNode = value.all;
144
+ const globalVars = readVarsObject(allNode.vars, context, "all.vars");
145
+ const hosts = new Map();
146
+ const groups = new Map();
147
+ walkCanonicalGroup("all", allNode, hosts, groups, context, true);
148
+ for (const hostName of hosts.keys()) {
149
+ if (groups.has(hostName)) {
150
+ context.errors.push({
151
+ code: "inventory_name_collision",
152
+ message: `Host/group name collision: ${hostName}`,
153
+ path: hostName
154
+ });
155
+ }
156
+ }
157
+ groups.delete("all");
158
+ return {
159
+ schemaKind: "canonical-ansible-yaml",
160
+ globalVars,
161
+ hosts,
162
+ groups
163
+ };
164
+ }
165
+ function walkCanonicalGroup(groupName, node, hosts, groups, context, isRoot = false) {
166
+ validateSafeName(groupName, "group", context, groupName);
167
+ for (const key of Object.keys(node)) {
168
+ if (!CANONICAL_GROUP_KEYS.has(key)) {
169
+ context.errors.push({
170
+ code: "inventory_group_structural_key_invalid",
171
+ message: `Unsupported key ${key} in canonical group ${groupName}`,
172
+ path: `${groupName}.${key}`
173
+ });
174
+ }
175
+ }
176
+ const vars = readVarsObject(node.vars, context, `${groupName}.vars`);
177
+ const hostNames = [];
178
+ const childGroups = [];
179
+ if (node.hosts !== undefined && !isObject(node.hosts)) {
180
+ context.errors.push({
181
+ code: "inventory_hosts_invalid",
182
+ message: `Canonical group ${groupName} hosts must be a mapping/object`,
183
+ path: `${groupName}.hosts`
184
+ });
185
+ }
186
+ if (isObject(node.hosts)) {
187
+ for (const [hostName, hostNode] of Object.entries(node.hosts)) {
188
+ validateSafeName(hostName, "host", context, `${groupName}.hosts.${hostName}`);
189
+ hostNames.push(hostName);
190
+ if (hostNode !== undefined && hostNode !== null && !isObject(hostNode)) {
191
+ context.errors.push({
192
+ code: "inventory_host_invalid",
193
+ message: `Canonical host ${hostName} must be a mapping/object`,
194
+ path: `${groupName}.hosts.${hostName}`
195
+ });
196
+ continue;
197
+ }
198
+ if (!hosts.has(hostName)) {
199
+ hosts.set(hostName, isObject(hostNode) ? { ...hostNode } : {});
200
+ }
201
+ else if (isObject(hostNode) && Object.keys(hostNode).length > 0) {
202
+ context.errors.push({
203
+ code: "inventory_host_duplicate_definition",
204
+ message: `Canonical host ${hostName} is defined with vars in multiple locations`,
205
+ path: `${groupName}.hosts.${hostName}`
206
+ });
207
+ }
208
+ }
209
+ }
210
+ if (node.children !== undefined && !isObject(node.children)) {
211
+ context.errors.push({
212
+ code: "inventory_children_invalid",
213
+ message: `Canonical group ${groupName} children must be a mapping/object`,
214
+ path: `${groupName}.children`
215
+ });
216
+ }
217
+ if (isObject(node.children)) {
218
+ for (const [childGroupName, childNode] of Object.entries(node.children)) {
219
+ validateSafeName(childGroupName, "group", context, `${groupName}.children.${childGroupName}`);
220
+ childGroups.push(childGroupName);
221
+ if (childNode === null || childNode === undefined) {
222
+ if (!groups.has(childGroupName)) {
223
+ groups.set(childGroupName, { name: childGroupName, vars: {}, hosts: [], children: [] });
224
+ }
225
+ continue;
226
+ }
227
+ if (!isObject(childNode)) {
228
+ context.errors.push({
229
+ code: "inventory_group_invalid",
230
+ message: `Canonical child group ${childGroupName} must be a mapping/object`,
231
+ path: `${groupName}.children.${childGroupName}`
232
+ });
233
+ continue;
234
+ }
235
+ walkCanonicalGroup(childGroupName, childNode, hosts, groups, context);
236
+ }
237
+ }
238
+ if (!isRoot) {
239
+ const existing = groups.get(groupName);
240
+ if (existing) {
241
+ const mergedHosts = [...new Set([...existing.hosts, ...hostNames])];
242
+ const mergedChildren = [...new Set([...existing.children, ...childGroups])];
243
+ const mergedVars = { ...existing.vars, ...vars };
244
+ groups.set(groupName, { name: groupName, vars: mergedVars, hosts: mergedHosts, children: mergedChildren });
245
+ }
246
+ else {
247
+ groups.set(groupName, { name: groupName, vars, hosts: hostNames, children: childGroups });
248
+ }
249
+ }
250
+ }
251
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/inventory/normalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { InventoryValidationError } from "./types.js";
2
+ export interface ParsedInventoryDocumentResult {
3
+ rootValue?: unknown;
4
+ errors: InventoryValidationError[];
5
+ }
6
+ export declare function parseInventoryDocument(inventoryPath: string): Promise<ParsedInventoryDocumentResult>;
@@ -0,0 +1,31 @@
1
+ import fs from "node:fs/promises";
2
+ import { parseDocument } from "yaml";
3
+ export async function parseInventoryDocument(inventoryPath) {
4
+ try {
5
+ const text = await fs.readFile(inventoryPath, "utf8");
6
+ const doc = parseDocument(text, { uniqueKeys: true, merge: true, prettyErrors: true });
7
+ if (doc.errors.length > 0) {
8
+ return {
9
+ errors: doc.errors.map((error) => ({
10
+ code: "inventory_yaml_invalid",
11
+ message: `Invalid inventory YAML: ${error.message}`
12
+ }))
13
+ };
14
+ }
15
+ return {
16
+ rootValue: doc.toJS(),
17
+ errors: []
18
+ };
19
+ }
20
+ catch (error) {
21
+ return {
22
+ errors: [
23
+ {
24
+ code: "inventory_validation_failed",
25
+ message: error instanceof Error ? error.message : String(error)
26
+ }
27
+ ]
28
+ };
29
+ }
30
+ }
31
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/inventory/parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAQrC,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,aAAqB;IAChE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,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,OAAO;gBACL,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBACjC,IAAI,EAAE,wBAAwB;oBAC9B,OAAO,EAAE,2BAA2B,KAAK,CAAC,OAAO,EAAE;iBACpD,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;QAED,OAAO;YACL,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE;YACrB,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,MAAM,EAAE;gBACN;oBACE,IAAI,EAAE,6BAA6B;oBACnC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAChE;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { InventoryValidationError } from "./types.js";
2
+ export interface HostEligibilityEvaluation {
3
+ eligible: boolean;
4
+ ineligibilityReasons: string[];
5
+ errors: InventoryValidationError[];
6
+ }
7
+ export interface HostAccessEvaluation {
8
+ readAllowed: boolean;
9
+ }
10
+ export declare function evaluateHostEligibility(hostName: string, effectiveVars: Record<string, unknown>): HostEligibilityEvaluation;
11
+ export declare function evaluateHostAccess(eligible: boolean, effectiveVars: Record<string, unknown>): HostAccessEvaluation;
@@ -0,0 +1,27 @@
1
+ import { readBoolean, readString } from "../utils/value.js";
2
+ export function evaluateHostEligibility(hostName, effectiveVars) {
3
+ const ansibleNetworkOs = readString(effectiveVars.ansible_network_os);
4
+ const mcpPlatform = readString(effectiveVars.mcp_platform);
5
+ const errors = [];
6
+ if (ansibleNetworkOs !== undefined &&
7
+ mcpPlatform !== undefined &&
8
+ ((ansibleNetworkOs === "eos") !== (mcpPlatform === "arista_eos"))) {
9
+ errors.push({
10
+ code: "inventory_platform_conflict",
11
+ message: `Host ${hostName} has conflicting platform declarations ansible_network_os=${ansibleNetworkOs} and mcp_platform=${mcpPlatform}`,
12
+ path: hostName
13
+ });
14
+ }
15
+ const eligible = ansibleNetworkOs === "eos" || mcpPlatform === "arista_eos";
16
+ return {
17
+ eligible,
18
+ ineligibilityReasons: eligible ? [] : ["host is not explicitly marked as EOS eligible"],
19
+ errors
20
+ };
21
+ }
22
+ export function evaluateHostAccess(eligible, effectiveVars) {
23
+ return {
24
+ readAllowed: eligible ? readBoolean(effectiveVars.mcp_read_allowed) ?? true : false
25
+ };
26
+ }
27
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/inventory/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAa5D,MAAM,UAAU,uBAAuB,CACrC,QAAgB,EAChB,aAAsC;IAEtC,MAAM,gBAAgB,GAAG,UAAU,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAC3D,MAAM,MAAM,GAA+B,EAAE,CAAC;IAE9C,IACE,gBAAgB,KAAK,SAAS;QAC9B,WAAW,KAAK,SAAS;QACzB,CAAC,CAAC,gBAAgB,KAAK,KAAK,CAAC,KAAK,CAAC,WAAW,KAAK,YAAY,CAAC,CAAC,EACjE,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,6BAA6B;YACnC,OAAO,EAAE,QAAQ,QAAQ,6DAA6D,gBAAgB,qBAAqB,WAAW,EAAE;YACxI,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,gBAAgB,KAAK,KAAK,IAAI,WAAW,KAAK,YAAY,CAAC;IAE5E,OAAO;QACL,QAAQ;QACR,oBAAoB,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,+CAA+C,CAAC;QACvF,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,QAAiB,EACjB,aAAsC;IAEtC,OAAO;QACL,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK;KACpF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { AppError } from "../core/errors.js";
2
+ import type { InventoryHostModel, InventoryModel } from "./types.js";
3
+ export interface ResolveInventoryTargetOptions {
4
+ target: string;
5
+ }
6
+ export interface ResolvedInventoryTarget {
7
+ target: string;
8
+ targetType: "host" | "group";
9
+ resolvedHosts: InventoryHostModel[];
10
+ }
11
+ export declare class InventoryResolutionError extends AppError {
12
+ constructor(code: string, message: string);
13
+ }
14
+ export declare function resolveInventoryTarget(model: InventoryModel, options: ResolveInventoryTargetOptions): ResolvedInventoryTarget;