@aristanetworks/eos-mcp-server 0.6.1-beta → 0.8.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 (76) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +171 -44
  3. package/dist/config/diagnostics.d.ts +65 -0
  4. package/dist/config/diagnostics.js +38 -0
  5. package/dist/config/diagnostics.js.map +1 -0
  6. package/dist/config/loadConfig.js +1 -0
  7. package/dist/config/loadConfig.js.map +1 -1
  8. package/dist/config/schema.d.ts +182 -8
  9. package/dist/config/schema.js +3 -0
  10. package/dist/config/schema.js.map +1 -1
  11. package/dist/diagnostics/concurrency.d.ts +29 -0
  12. package/dist/diagnostics/concurrency.js +115 -0
  13. package/dist/diagnostics/concurrency.js.map +1 -0
  14. package/dist/diagnostics/eapiRunner.d.ts +10 -0
  15. package/dist/diagnostics/eapiRunner.js +52 -0
  16. package/dist/diagnostics/eapiRunner.js.map +1 -0
  17. package/dist/diagnostics/executionError.d.ts +7 -0
  18. package/dist/diagnostics/executionError.js +10 -0
  19. package/dist/diagnostics/executionError.js.map +1 -0
  20. package/dist/diagnostics/executor.d.ts +31 -0
  21. package/dist/diagnostics/executor.js +114 -0
  22. package/dist/diagnostics/executor.js.map +1 -0
  23. package/dist/diagnostics/ping.d.ts +7 -0
  24. package/dist/diagnostics/ping.js +131 -0
  25. package/dist/diagnostics/ping.js.map +1 -0
  26. package/dist/diagnostics/types.d.ts +81 -0
  27. package/dist/diagnostics/types.js +2 -0
  28. package/dist/diagnostics/types.js.map +1 -0
  29. package/dist/eapi/client.d.ts +3 -1
  30. package/dist/eapi/client.js +18 -6
  31. package/dist/eapi/client.js.map +1 -1
  32. package/dist/eapi/types.d.ts +9 -0
  33. package/dist/eapi/types.js.map +1 -1
  34. package/dist/inventory/buildModel.js +1 -0
  35. package/dist/inventory/buildModel.js.map +1 -1
  36. package/dist/inventory/listInventoryView.d.ts +1 -0
  37. package/dist/inventory/listInventoryView.js +1 -0
  38. package/dist/inventory/listInventoryView.js.map +1 -1
  39. package/dist/inventory/policy.d.ts +1 -0
  40. package/dist/inventory/policy.js +3 -1
  41. package/dist/inventory/policy.js.map +1 -1
  42. package/dist/inventory/types.d.ts +1 -0
  43. package/dist/inventory/varValidation.js +1 -0
  44. package/dist/inventory/varValidation.js.map +1 -1
  45. package/dist/mcp/createServer.js +39 -4
  46. package/dist/mcp/createServer.js.map +1 -1
  47. package/dist/mcp/tools/getServerInfo.d.ts +2 -1
  48. package/dist/mcp/tools/getServerInfo.js +2 -2
  49. package/dist/mcp/tools/getServerInfo.js.map +1 -1
  50. package/dist/mcp/tools/ping.d.ts +31 -0
  51. package/dist/mcp/tools/ping.js +27 -0
  52. package/dist/mcp/tools/ping.js.map +1 -0
  53. package/dist/operations/readExecution.d.ts +3 -1
  54. package/dist/operations/readExecution.js +24 -16
  55. package/dist/operations/readExecution.js.map +1 -1
  56. package/dist/serverInfo/buildServerInfo.d.ts +2 -1
  57. package/dist/serverInfo/buildServerInfo.js +17 -2
  58. package/dist/serverInfo/buildServerInfo.js.map +1 -1
  59. package/dist/serverInfo/types.d.ts +16 -0
  60. package/docs/CHECKPOINT.md +8 -1
  61. package/docs/CODE_WALKTHROUGH.md +25 -6
  62. package/docs/DESIGN.md +17 -4
  63. package/docs/DIAGNOSTICS.md +167 -0
  64. package/docs/IMPLEMENTATION_PLAN.md +4 -3
  65. package/docs/QUICKSTART.md +13 -13
  66. package/docs/adr/0001-non-configuring-diagnostics.md +5 -0
  67. package/docs/adr/0002-fail-closed-diagnostic-reservations.md +9 -0
  68. package/docs/adr/0003-durable-diagnostic-ledger.md +11 -0
  69. package/docs/adr/0004-offline-operator-attested-release.md +7 -0
  70. package/docs/adr/0005-multi-destination-ping.md +9 -0
  71. package/docs/adr/0006-in-memory-timed-diagnostic-capacity.md +21 -0
  72. package/docs/research/eos-diagnostic-lifecycle.md +86 -0
  73. package/package.json +1 -1
  74. package/dist/inventory/writePolicy.d.ts +0 -2
  75. package/dist/inventory/writePolicy.js +0 -36
  76. package/dist/inventory/writePolicy.js.map +0 -1
@@ -0,0 +1,114 @@
1
+ import { AppError, toErrorCode } from "../core/errors.js";
2
+ import { resolveInventoryTarget } from "../inventory/resolveTarget.js";
3
+ import { buildDeviceResultSummary, buildReadDeviceFailure, buildReadDeviceSuccess, buildReadOperationResultEnvelope, enforceReadTargetLimit, mapWithConcurrency, runWithOperationTimeout } from "../operations/readExecution.js";
4
+ import { DiagnosticConcurrency } from "./concurrency.js";
5
+ import { DiagnosticExecutionError } from "./executionError.js";
6
+ import { pingDiagnostic } from "./ping.js";
7
+ const diagnosticDefinitions = {
8
+ ping: pingDiagnostic
9
+ };
10
+ /** Owns policy, budgets, fan-out, global admission, cancellation, and result normalization. */
11
+ export class DiagnosticExecutor {
12
+ model;
13
+ config;
14
+ runner;
15
+ concurrency;
16
+ shutdown = new AbortController();
17
+ constructor(model, config, runner) {
18
+ this.model = model;
19
+ this.config = config;
20
+ this.runner = runner;
21
+ this.concurrency = new DiagnosticConcurrency(config.diagnostics.deviceConcurrency, config.diagnostics.commandTimeoutMs);
22
+ }
23
+ close() {
24
+ this.shutdown.abort(new AppError("diagnostic_server_stopping", "Diagnostic executor is stopping"));
25
+ this.concurrency.close();
26
+ }
27
+ getCapacity() {
28
+ return this.concurrency.snapshot();
29
+ }
30
+ async execute(options) {
31
+ const signal = options.signal === undefined ? this.shutdown.signal : AbortSignal.any([options.signal, this.shutdown.signal]);
32
+ const definition = diagnosticDefinitions[options.request.kind];
33
+ const prepared = definition.prepare(options.request, this.config.diagnostics);
34
+ const operationName = `eos_${options.request.kind}`;
35
+ const operationConfig = {
36
+ ...this.config,
37
+ deviceConcurrency: this.config.diagnostics.deviceConcurrency,
38
+ overallOperationTimeoutMs: this.config.diagnostics.overallOperationTimeoutMs
39
+ };
40
+ const resolvedTarget = resolveInventoryTarget(this.model, { target: options.target });
41
+ enforceReadTargetLimit(operationConfig, resolvedTarget.resolvedHosts.length);
42
+ const denied = resolvedTarget.resolvedHosts.filter((host) => !host.diagnosticsAllowed);
43
+ if (denied.length > 0) {
44
+ throw new AppError("diagnostic_policy_denied", `Diagnostic permission denied for: ${denied.map((host) => host.inventoryHostname).join(", ")}`);
45
+ }
46
+ const probesPerHost = prepared.executions.reduce((total, execution) => total + definition.probeCount(execution), 0);
47
+ if (resolvedTarget.resolvedHosts.length * probesPerHost > this.config.diagnostics.maxProbesPerRequest) {
48
+ throw new AppError("diagnostic_probe_limit_exceeded", `Request exceeds maxProbesPerRequest ${this.config.diagnostics.maxProbesPerRequest}`);
49
+ }
50
+ // Each host/execution pair takes its own reservation; results stay in host-then-execution order.
51
+ const hostExecutions = resolvedTarget.resolvedHosts.flatMap((host) => prepared.executions.map((execution) => ({ host, execution })));
52
+ const results = await runWithOperationTimeout(operationConfig, operationName, (operationSignal) => mapWithConcurrency(hostExecutions, operationConfig.deviceConcurrency, async ({ host, execution }) => {
53
+ try {
54
+ return await this.runExecution(definition, host, execution, operationSignal, options.includeRaw === true);
55
+ }
56
+ catch (error) {
57
+ return {
58
+ ...buildReadDeviceFailure(host, "diagnostic_execution_failed", error),
59
+ destination: execution.destination,
60
+ ...(options.includeRaw === true && error instanceof AppError && typeof error.details?.raw_output === "string"
61
+ ? { raw_output: error.details.raw_output }
62
+ : {})
63
+ };
64
+ }
65
+ }, operationSignal), signal);
66
+ return buildReadOperationResultEnvelope(options.target, { resolvedTarget, results, summary: buildDeviceResultSummary(results) }, {
67
+ extra: { request: prepared.request },
68
+ responseSizeLimit: { config: this.config, operationName }
69
+ });
70
+ }
71
+ async runExecution(definition, host, execution, signal, includeRaw) {
72
+ const observation = await this.executeOnDevice(host, execution, signal);
73
+ try {
74
+ return buildReadDeviceSuccess(host, {
75
+ destination: execution.destination,
76
+ finding: definition.interpret(observation.output, execution),
77
+ ...(includeRaw ? { raw_output: observation.output } : {})
78
+ });
79
+ }
80
+ catch (error) {
81
+ if (error instanceof AppError && includeRaw) {
82
+ throw new AppError(error.code, error.message, { raw_output: observation.output });
83
+ }
84
+ throw error;
85
+ }
86
+ }
87
+ async executeOnDevice(host, request, signal) {
88
+ const reservation = await this.concurrency.acquire(signal, { inventoryHostname: host.inventoryHostname, diagnostic: request.kind });
89
+ if (signal.aborted) {
90
+ reservation.complete();
91
+ throw new AppError("operation_aborted", "Diagnostic was cancelled before dispatch");
92
+ }
93
+ const onAbort = () => reservation.markUncertain(toErrorCode(signal.reason, "operation_aborted"));
94
+ signal.addEventListener("abort", onAbort, { once: true });
95
+ try {
96
+ const observation = await this.runner.execute(host, request, { signal, requestId: reservation.requestId });
97
+ reservation.complete();
98
+ return observation;
99
+ }
100
+ catch (error) {
101
+ if (error instanceof DiagnosticExecutionError && (error.executionState === "not_dispatched" || error.executionState === "completed")) {
102
+ reservation.complete();
103
+ }
104
+ else {
105
+ reservation.markUncertain(toErrorCode(error, "diagnostic_execution_failed"));
106
+ }
107
+ throw error;
108
+ }
109
+ finally {
110
+ signal.removeEventListener("abort", onAbort);
111
+ }
112
+ }
113
+ }
114
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/diagnostics/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { DiagnosticsConfig } from "../config/diagnostics.js";
2
+ import type { DiagnosticDefinition, PingExecutionRequest, PingFinding, PreparedPing } from "./types.js";
3
+ export declare const pingDiagnostic: DiagnosticDefinition;
4
+ export declare function preparePing(request: PingExecutionRequest, config: DiagnosticsConfig): PreparedPing;
5
+ /** Verified on cEOS 4.34.3M. `timeout` is per-reply, not a wall-clock deadline. */
6
+ export declare function buildPingCommand(request: PreparedPing): string;
7
+ export declare function parsePingOutput(output: string, expectedCount: number): PingFinding;
@@ -0,0 +1,131 @@
1
+ import { isIP } from "node:net";
2
+ import { pingExecutionBoundMs } from "../config/diagnostics.js";
3
+ import { AppError } from "../core/errors.js";
4
+ export const pingDiagnostic = {
5
+ prepare(request, config) {
6
+ const { destinations, ...shared } = request;
7
+ if (destinations.length === 0 || destinations.length > config.maxDestinationsPerRequest) {
8
+ throw new AppError("diagnostic_destination_limit_exceeded", `Provide between 1 and ${config.maxDestinationsPerRequest} destinations`);
9
+ }
10
+ // Every destination is validated before any is dispatched.
11
+ const executions = destinations.map((destination) => preparePing({ ...shared, destination }, config));
12
+ // Compare canonical forms so alternate IPv6 spellings of one address are caught.
13
+ if (new Set(executions.map((execution) => canonicalAddress(execution.destination, execution.addressFamily))).size !== executions.length) {
14
+ throw new AppError("diagnostic_destination_duplicate", "Each destination may appear only once per request");
15
+ }
16
+ const count = executions[0]?.count ?? config.defaultPingCount;
17
+ return { request: { ...request, count }, executions };
18
+ },
19
+ probeCount: (execution) => execution.count,
20
+ interpret: (output, execution) => parsePingOutput(output, execution.count)
21
+ };
22
+ export function preparePing(request, config) {
23
+ const addressFamily = validateAddress(request.destination);
24
+ const count = request.count ?? config.defaultPingCount;
25
+ if (!Number.isSafeInteger(count) || count < 1 || count > config.maxPingCount) {
26
+ throw new AppError("diagnostic_count_invalid", `Ping count must be between 1 and ${config.maxPingCount}`);
27
+ }
28
+ if (pingExecutionBoundMs(count, config.pingReplyTimeoutMs) > config.commandTimeoutMs) {
29
+ throw new AppError("diagnostic_command_budget_exceeded", "Ping exceeds the configured device command budget");
30
+ }
31
+ if (request.vrf !== undefined && !/^[A-Za-z0-9_][A-Za-z0-9_.:-]{0,63}$/.test(request.vrf)) {
32
+ throw new AppError("diagnostic_vrf_invalid", "VRF must be a single safe identifier (1-64 characters)");
33
+ }
34
+ if (request.source !== undefined && validateAddress(request.source) !== addressFamily) {
35
+ throw new AppError("diagnostic_source_invalid", "Source and destination must use the same IP address family");
36
+ }
37
+ return { ...request, count, addressFamily, replyTimeoutSeconds: config.pingReplyTimeoutMs / 1000 };
38
+ }
39
+ function validateAddress(address) {
40
+ const family = isIP(address);
41
+ if (family === 0 || address.includes("%")) {
42
+ throw new AppError("diagnostic_address_invalid", "Use an IPv4 or IPv6 literal without interface scoping");
43
+ }
44
+ if (family === 4) {
45
+ validateIpv4(address.split(".").map(Number));
46
+ return 4;
47
+ }
48
+ const halves = canonicalAddress(address, 6).split("::");
49
+ const left = halves[0]?.split(":").filter(Boolean) ?? [];
50
+ const right = halves[1]?.split(":").filter(Boolean) ?? [];
51
+ const words = halves.length === 1
52
+ ? left.map((word) => Number.parseInt(word, 16))
53
+ : [...left, ...Array(8 - left.length - right.length).fill("0"), ...right].map((word) => Number.parseInt(word, 16));
54
+ const first = words[0] ?? 0;
55
+ if (words.every((word) => word === 0) || (first & 0xff00) === 0xff00 || (first & 0xffc0) === 0xfe80) {
56
+ throw new AppError("diagnostic_address_invalid", "Unspecified, multicast, and IPv6 link-local addresses are not supported");
57
+ }
58
+ if (words.slice(0, 5).every((word) => word === 0) && words[5] === 0xffff) {
59
+ // Prevent mapped addresses from bypassing IPv4 destination restrictions.
60
+ const high = words[6] ?? 0;
61
+ const low = words[7] ?? 0;
62
+ validateIpv4([high >> 8, high & 255, low >> 8, low & 255]);
63
+ }
64
+ return 6;
65
+ }
66
+ /** Expects a literal already accepted by `isIP`, which only admits canonical dotted-decimal IPv4. */
67
+ function canonicalAddress(address, addressFamily) {
68
+ // WHATWG URL canonicalization compresses zeros, lowercases, and expands dotted IPv4-mapped IPv6 into hex words.
69
+ return addressFamily === 6 ? new URL(`http://[${address}]/`).hostname.slice(1, -1) : address;
70
+ }
71
+ function validateIpv4(octets) {
72
+ if ((octets[0] ?? 0) === 0 || (octets[0] ?? 0) >= 224) {
73
+ throw new AppError("diagnostic_address_invalid", "Unspecified, multicast, reserved, and limited broadcast addresses are not supported");
74
+ }
75
+ }
76
+ /** Verified on cEOS 4.34.3M. `timeout` is per-reply, not a wall-clock deadline. */
77
+ export function buildPingCommand(request) {
78
+ return [
79
+ "ping",
80
+ ...(request.vrf === undefined ? [] : ["vrf", request.vrf]),
81
+ request.addressFamily === 6 ? "ipv6" : "ip",
82
+ request.destination,
83
+ ...(request.source === undefined ? [] : ["source", request.source]),
84
+ "repeat", String(request.count),
85
+ "timeout", String(request.replyTimeoutSeconds),
86
+ "interval", "1",
87
+ "size", "64"
88
+ ].join(" ");
89
+ }
90
+ export function parsePingOutput(output, expectedCount) {
91
+ const normalized = output.replace(/\r\n/g, "\n");
92
+ if (/^(?:ping6?:|%)/m.test(normalized)) {
93
+ throw new AppError("diagnostic_command_failed", "EOS could not execute the requested ping");
94
+ }
95
+ const matches = [...normalized.matchAll(/^(\d+) packets transmitted, (\d+)(?: packets)? received,(?: \+\d+ (?:errors|duplicates),)* ([\d.]+)% packet loss[^\r\n]*$/gm)];
96
+ const stats = matches.length === 1 ? matches[0] : undefined;
97
+ if (!stats) {
98
+ throw new AppError("diagnostic_output_unrecognized", "EOS ping output did not contain one recognized packet summary");
99
+ }
100
+ const sent = Number(stats[1]);
101
+ const received = Number(stats[2]);
102
+ const reportedLoss = Number(stats[3]);
103
+ const loss = 100 * (sent - received) / sent;
104
+ if (sent < 1 || !Number.isSafeInteger(sent) || sent !== expectedCount || !Number.isSafeInteger(received) || received < 0 || received > sent ||
105
+ !Number.isFinite(reportedLoss) || reportedLoss < 0 || reportedLoss > 100 || Math.abs(reportedLoss - loss) > 1) {
106
+ throw new AppError("diagnostic_output_unrecognized", "EOS ping packet summary was incomplete or inconsistent");
107
+ }
108
+ const timing = /^(?:rtt|round-trip) min\/avg\/max\/(?:mdev|stddev) = ([\d.]+)\/([\d.]+)\/([\d.]+)\/[\d.]+ ms/m.exec(normalized);
109
+ if (/^(?:rtt|round-trip) /m.test(normalized) && timing === null) {
110
+ throw new AppError("diagnostic_output_unrecognized", "EOS ping RTT summary was not recognized");
111
+ }
112
+ let rtt = null;
113
+ if (timing) {
114
+ const min = Number(timing[1]);
115
+ const avg = Number(timing[2]);
116
+ const max = Number(timing[3]);
117
+ if (received === 0 || ![min, avg, max].every(Number.isFinite) || min < 0 || min > avg || avg > max) {
118
+ throw new AppError("diagnostic_output_unrecognized", "EOS ping RTT summary was inconsistent");
119
+ }
120
+ rtt = { min, avg, max };
121
+ }
122
+ return {
123
+ kind: "ping",
124
+ reachability: received === 0 ? "unreachable" : received === sent ? "reachable" : "partial",
125
+ packets_sent: sent,
126
+ packets_received: received,
127
+ packet_loss_percent: Number(loss.toFixed(4)),
128
+ rtt_ms: rtt
129
+ };
130
+ }
131
+ //# sourceMappingURL=ping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ping.js","sourceRoot":"","sources":["../../src/diagnostics/ping.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import type { DiagnosticsConfig } from "../config/diagnostics.js";
2
+ import type { InventoryHostModel } from "../inventory/types.js";
3
+ export interface PingRequest {
4
+ kind: "ping";
5
+ destinations: string[];
6
+ count?: number;
7
+ vrf?: string;
8
+ source?: string;
9
+ }
10
+ export type DiagnosticRequest = PingRequest;
11
+ /** One ping execution: a single destination with the request's shared options. */
12
+ export interface PingExecutionRequest extends Omit<PingRequest, "destinations"> {
13
+ destination: string;
14
+ }
15
+ export interface PreparedPing extends Omit<PingExecutionRequest, "count"> {
16
+ count: number;
17
+ addressFamily: 4 | 6;
18
+ replyTimeoutSeconds: number;
19
+ }
20
+ export type PreparedDiagnostic = PreparedPing;
21
+ export type DiagnosticObservation = {
22
+ kind: "ping";
23
+ output: string;
24
+ };
25
+ export interface PingFinding {
26
+ kind: "ping";
27
+ reachability: "reachable" | "partial" | "unreachable";
28
+ packets_sent: number;
29
+ packets_received: number;
30
+ packet_loss_percent: number;
31
+ rtt_ms: {
32
+ min: number;
33
+ avg: number;
34
+ max: number;
35
+ } | null;
36
+ }
37
+ export type DiagnosticFinding = PingFinding;
38
+ /** The request echoed in results, with server defaults applied. */
39
+ export type ResolvedDiagnosticRequest = DiagnosticRequest & {
40
+ count: number;
41
+ };
42
+ /** Per-kind seam: validation and probe cost before dispatch, interpretation after.
43
+ * The executor runs every prepared execution on every resolved host; device I/O stays in the runner.
44
+ */
45
+ export interface DiagnosticDefinition {
46
+ prepare(request: DiagnosticRequest, config: DiagnosticsConfig): {
47
+ request: ResolvedDiagnosticRequest;
48
+ executions: PreparedDiagnostic[];
49
+ };
50
+ probeCount(execution: PreparedDiagnostic): number;
51
+ interpret(output: string, execution: PreparedDiagnostic): DiagnosticFinding;
52
+ }
53
+ /** `reservation_id` doubles as the execution's JSON-RPC request ID. */
54
+ export interface DiagnosticReservationInfo {
55
+ reservation_id: string;
56
+ inventory_hostname: string;
57
+ diagnostic: DiagnosticRequest["kind"];
58
+ state: "active" | "uncertain";
59
+ reserved_at: string;
60
+ uncertain_since?: string;
61
+ releases_at?: string;
62
+ reason_code?: string;
63
+ }
64
+ export interface DiagnosticCapacitySnapshot {
65
+ limit: number;
66
+ available_count: number;
67
+ active_count: number;
68
+ uncertain_count: number;
69
+ queued_count: number;
70
+ reservations: DiagnosticReservationInfo[];
71
+ }
72
+ export interface DiagnosticExecutionContext {
73
+ signal: AbortSignal;
74
+ requestId: string;
75
+ }
76
+ /** Device execution seam: inventory identity, typed intent, and the reserved attempt ID.
77
+ * Errors stay uncertain unless classified as not_dispatched/completed by DiagnosticExecutionError.
78
+ */
79
+ export interface DiagnosticDeviceRunner {
80
+ execute(host: InventoryHostModel, request: PreparedDiagnostic, context: DiagnosticExecutionContext): Promise<DiagnosticObservation>;
81
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/diagnostics/types.ts"],"names":[],"mappings":""}
@@ -1,8 +1,10 @@
1
- import { type EapiConnectionConfig, type EapiOutputMode, type EosCommandResult, type RunShowCommandOptions } from "./types.js";
1
+ import { type EapiConnectionConfig, type EapiOutputMode, type EosCommandResult, type RunShowCommandOptions, type RunTextCommandOptions } from "./types.js";
2
2
  import { type EapiTransport } from "./transport.js";
3
3
  export declare class EapiClient {
4
4
  private readonly transport;
5
5
  constructor(transport?: EapiTransport);
6
6
  runShowCommands(connection: EapiConnectionConfig, commands: string[], outputMode: EapiOutputMode, options?: RunShowCommandOptions): Promise<EosCommandResult[]>;
7
+ /** Execute once in text mode. Active diagnostics must never use JSON fallback retries. */
8
+ runTextCommands(connection: EapiConnectionConfig, commands: string[], options?: RunTextCommandOptions): Promise<EosCommandResult[]>;
7
9
  private runCommands;
8
10
  }
@@ -26,6 +26,11 @@ export class EapiClient {
26
26
  return run("text");
27
27
  }
28
28
  }
29
+ /** Execute once in text mode. Active diagnostics must never use JSON fallback retries. */
30
+ async runTextCommands(connection, commands, options) {
31
+ const payload = await this.runCommands(connection, commands, "text", options);
32
+ return buildCommandResults(payload, commands, "text", false);
33
+ }
29
34
  async runCommands(connection, commands, format, options) {
30
35
  if (commands.length === 0) {
31
36
  throw new AppError("eapi_commands_missing", "runCommands requires at least one command");
@@ -38,9 +43,10 @@ export class EapiClient {
38
43
  params: {
39
44
  version: connection.eapiVersion,
40
45
  cmds: wireCommands,
41
- format
46
+ format,
47
+ ...(options?.requestTimeoutSeconds === undefined ? {} : { requestTimeout: options.requestTimeoutSeconds })
42
48
  },
43
- id: randomUUID()
49
+ id: options?.requestId ?? randomUUID()
44
50
  };
45
51
  const requestSignal = buildRequestSignal(connection.timeoutMs, options?.signal);
46
52
  const requestJson = JSON.stringify(requestBody);
@@ -58,6 +64,12 @@ export class EapiClient {
58
64
  });
59
65
  }
60
66
  const payload = await parseJsonResponse(response, connection);
67
+ if (!isObject(payload) || payload.jsonrpc !== "2.0" || payload.id !== requestBody.id) {
68
+ throw new AppError("eapi_response_uncorrelated", "EOS response must use JSON-RPC 2.0 and match the exact request ID; remote completion is unknown");
69
+ }
70
+ if (Object.hasOwn(payload, "result") === Object.hasOwn(payload, "error")) {
71
+ throw new AppError("eapi_payload_invalid", "EOS response must contain exactly one result or error member; remote completion is unknown");
72
+ }
61
73
  throwIfJsonRpcError(payload);
62
74
  const normalizedPayload = useEnable ? stripEnableResult(payload) : payload;
63
75
  parseEapiRunCmdsResponse(normalizedPayload, commands.length);
@@ -111,7 +123,7 @@ function classifyTransportError(error, signal, connection) {
111
123
  return reason;
112
124
  }
113
125
  if (isTimeoutAbortReason(reason)) {
114
- return new AppError("eapi_request_timeout", `EOS eAPI request for host ${connection.inventoryHostname} exceeded readTimeoutMs ${connection.timeoutMs}`, {
126
+ return new AppError("eapi_request_timeout", `EOS eAPI request for host ${connection.inventoryHostname} exceeded timeout ${connection.timeoutMs} ms`, {
115
127
  inventoryHostname: connection.inventoryHostname,
116
128
  timeoutMs: connection.timeoutMs
117
129
  });
@@ -142,16 +154,16 @@ function throwIfJsonRpcError(payload) {
142
154
  const code = typeof payload.error.code === "number" || typeof payload.error.code === "string" ? payload.error.code : "unknown";
143
155
  const data = payload.error.data;
144
156
  const details = data === undefined ? "" : `; data=${JSON.stringify(data)}`;
145
- throw new AppError(classifyJsonRpcErrorCode(message, data), `EOS eAPI JSON-RPC error ${String(code)}: ${message}${details}`, {
157
+ throw new AppError(classifyJsonRpcErrorCode(message, data, code), `EOS eAPI JSON-RPC error ${String(code)}: ${message}${details}`, {
146
158
  jsonRpcCode: code,
147
159
  ...(data !== undefined ? { data } : {})
148
160
  });
149
161
  }
150
- function classifyJsonRpcErrorCode(message, data) {
162
+ function classifyJsonRpcErrorCode(message, data, code) {
151
163
  const haystacks = [message, ...(Array.isArray(data) ? data.filter((entry) => typeof entry === "string") : [])]
152
164
  .join(" ")
153
165
  .toLowerCase();
154
- if (haystacks.includes("json")) {
166
+ if (haystacks.includes("json") || (code === 1003 && message.toLowerCase().includes("unconverted command"))) {
155
167
  return "json_output_unavailable";
156
168
  }
157
169
  return "eapi_json_rpc_error";
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/eapi/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/eapi/client.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,11 @@ export interface EapiCommandOptions {
17
17
  enable?: boolean;
18
18
  signal?: AbortSignal;
19
19
  }
20
+ export interface RunTextCommandOptions extends EapiCommandOptions {
21
+ requestId?: string;
22
+ /** EOS-side runCmds requestTimeout: the device interrupts the command list once it expires. */
23
+ requestTimeoutSeconds?: number;
24
+ }
20
25
  export interface RunShowCommandOptions extends EapiCommandOptions {
21
26
  includeRawEntries?: boolean;
22
27
  }
@@ -26,6 +31,9 @@ export interface EosCommandResult {
26
31
  output: unknown;
27
32
  raw_entry?: unknown;
28
33
  }
34
+ export interface EosTextCommandRunner {
35
+ runTextCommands(connection: EapiConnectionConfig, commands: string[], options?: RunTextCommandOptions): Promise<EosCommandResult[]>;
36
+ }
29
37
  export interface EosCommandRunner {
30
38
  runShowCommands(connection: EapiConnectionConfig, commands: string[], outputMode: EapiOutputMode, options?: RunShowCommandOptions): Promise<EosCommandResult[]>;
31
39
  }
@@ -44,6 +52,7 @@ export interface EapiJsonRpcRequest {
44
52
  version: EapiVersion;
45
53
  cmds: string[];
46
54
  format: EapiOutputFormat;
55
+ requestTimeout?: number;
47
56
  };
48
57
  id: string;
49
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/eapi/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA4C7C,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,IAAI,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACnF,CAAC;AAOD,MAAM,UAAU,wBAAwB,CAAC,OAAgB,EAAE,mBAA4B;IACrF,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,yDAAyD,CAAC,CAAC;IACxG,CAAC;IAED,IAAI,mBAAmB,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;QACvF,MAAM,IAAI,QAAQ,CAChB,sBAAsB,EACtB,+CAA+C,mBAAmB,gCAAgC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAC1H,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAClD,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/eapi/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA0D7C,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,IAAI,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACnF,CAAC;AAOD,MAAM,UAAU,wBAAwB,CAAC,OAAgB,EAAE,mBAA4B;IACrF,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,yDAAyD,CAAC,CAAC;IACxG,CAAC;IAED,IAAI,mBAAmB,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;QACvF,MAAM,IAAI,QAAQ,CAChB,sBAAsB,EACtB,+CAA+C,mBAAmB,gCAAgC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAC1H,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAClD,CAAC"}
@@ -20,6 +20,7 @@ export function buildInventoryModel(inventory, inventoryPath, context) {
20
20
  effectiveVars,
21
21
  eligible: eligibility.eligible,
22
22
  readAllowed: access.readAllowed,
23
+ diagnosticsAllowed: access.diagnosticsAllowed,
23
24
  ineligibilityReasons: eligibility.ineligibilityReasons,
24
25
  groupMemberships: [...lineageGroups].sort()
25
26
  });
@@ -1 +1 @@
1
- {"version":3,"file":"buildModel.js","sourceRoot":"","sources":["../../src/inventory/buildModel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"buildModel.js","sourceRoot":"","sources":["../../src/inventory/buildModel.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export interface ListInventoryView {
5
5
  resolved_endpoint: string;
6
6
  eligible: boolean;
7
7
  read_allowed: boolean;
8
+ diagnostics_allowed: boolean;
8
9
  ineligibility_reasons: string[];
9
10
  group_memberships: string[];
10
11
  }>;
@@ -6,6 +6,7 @@ export function buildListInventoryView(model, options) {
6
6
  resolved_endpoint: host.resolvedEndpoint,
7
7
  eligible: host.eligible,
8
8
  read_allowed: host.readAllowed,
9
+ diagnostics_allowed: host.diagnosticsAllowed,
9
10
  ineligibility_reasons: [...host.ineligibilityReasons],
10
11
  group_memberships: [...host.groupMemberships]
11
12
  }));
@@ -1 +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"}
1
+ {"version":3,"file":"listInventoryView.js","sourceRoot":"","sources":["../../src/inventory/listInventoryView.ts"],"names":[],"mappings":"AA0BA,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,mBAAmB,EAAE,IAAI,CAAC,kBAAkB;QAC5C,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"}
@@ -6,6 +6,7 @@ export interface HostEligibilityEvaluation {
6
6
  }
7
7
  export interface HostAccessEvaluation {
8
8
  readAllowed: boolean;
9
+ diagnosticsAllowed: boolean;
9
10
  }
10
11
  export declare function evaluateHostEligibility(hostName: string, effectiveVars: Record<string, unknown>): HostEligibilityEvaluation;
11
12
  export declare function evaluateHostAccess(eligible: boolean, effectiveVars: Record<string, unknown>): HostAccessEvaluation;
@@ -20,8 +20,10 @@ export function evaluateHostEligibility(hostName, effectiveVars) {
20
20
  };
21
21
  }
22
22
  export function evaluateHostAccess(eligible, effectiveVars) {
23
+ const readAllowed = eligible && (readBoolean(effectiveVars.mcp_read_allowed) ?? true);
23
24
  return {
24
- readAllowed: eligible ? readBoolean(effectiveVars.mcp_read_allowed) ?? true : false
25
+ readAllowed,
26
+ diagnosticsAllowed: readAllowed && effectiveVars.mcp_diagnostics_allowed === true
25
27
  };
26
28
  }
27
29
  //# sourceMappingURL=policy.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/inventory/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAc5D,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,MAAM,WAAW,GAAG,QAAQ,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,CAAC;IACtF,OAAO;QACL,WAAW;QACX,kBAAkB,EAAE,WAAW,IAAI,aAAa,CAAC,uBAAuB,KAAK,IAAI;KAClF,CAAC;AACJ,CAAC"}
@@ -26,6 +26,7 @@ export interface InventoryHostModel {
26
26
  effectiveVars: Record<string, unknown>;
27
27
  eligible: boolean;
28
28
  readAllowed: boolean;
29
+ diagnosticsAllowed: boolean;
29
30
  ineligibilityReasons: string[];
30
31
  groupMemberships: string[];
31
32
  }
@@ -1,5 +1,6 @@
1
1
  const BOOLEAN_VAR_KEYS = new Set([
2
2
  "mcp_read_allowed",
3
+ "mcp_diagnostics_allowed",
3
4
  "mcp_validate_certs",
4
5
  "ansible_httpapi_validate_certs"
5
6
  ]);