@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.
- package/CHANGELOG.md +26 -0
- package/README.md +171 -44
- package/dist/config/diagnostics.d.ts +65 -0
- package/dist/config/diagnostics.js +38 -0
- package/dist/config/diagnostics.js.map +1 -0
- package/dist/config/loadConfig.js +1 -0
- package/dist/config/loadConfig.js.map +1 -1
- package/dist/config/schema.d.ts +182 -8
- package/dist/config/schema.js +3 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/diagnostics/concurrency.d.ts +29 -0
- package/dist/diagnostics/concurrency.js +115 -0
- package/dist/diagnostics/concurrency.js.map +1 -0
- package/dist/diagnostics/eapiRunner.d.ts +10 -0
- package/dist/diagnostics/eapiRunner.js +52 -0
- package/dist/diagnostics/eapiRunner.js.map +1 -0
- package/dist/diagnostics/executionError.d.ts +7 -0
- package/dist/diagnostics/executionError.js +10 -0
- package/dist/diagnostics/executionError.js.map +1 -0
- package/dist/diagnostics/executor.d.ts +31 -0
- package/dist/diagnostics/executor.js +114 -0
- package/dist/diagnostics/executor.js.map +1 -0
- package/dist/diagnostics/ping.d.ts +7 -0
- package/dist/diagnostics/ping.js +131 -0
- package/dist/diagnostics/ping.js.map +1 -0
- package/dist/diagnostics/types.d.ts +81 -0
- package/dist/diagnostics/types.js +2 -0
- package/dist/diagnostics/types.js.map +1 -0
- package/dist/eapi/client.d.ts +3 -1
- package/dist/eapi/client.js +18 -6
- package/dist/eapi/client.js.map +1 -1
- package/dist/eapi/types.d.ts +9 -0
- package/dist/eapi/types.js.map +1 -1
- package/dist/inventory/buildModel.js +1 -0
- package/dist/inventory/buildModel.js.map +1 -1
- package/dist/inventory/listInventoryView.d.ts +1 -0
- package/dist/inventory/listInventoryView.js +1 -0
- package/dist/inventory/listInventoryView.js.map +1 -1
- package/dist/inventory/policy.d.ts +1 -0
- package/dist/inventory/policy.js +3 -1
- package/dist/inventory/policy.js.map +1 -1
- package/dist/inventory/types.d.ts +1 -0
- package/dist/inventory/varValidation.js +1 -0
- package/dist/inventory/varValidation.js.map +1 -1
- package/dist/mcp/createServer.js +39 -4
- package/dist/mcp/createServer.js.map +1 -1
- package/dist/mcp/tools/getServerInfo.d.ts +2 -1
- package/dist/mcp/tools/getServerInfo.js +2 -2
- package/dist/mcp/tools/getServerInfo.js.map +1 -1
- package/dist/mcp/tools/ping.d.ts +31 -0
- package/dist/mcp/tools/ping.js +27 -0
- package/dist/mcp/tools/ping.js.map +1 -0
- package/dist/operations/readExecution.d.ts +3 -1
- package/dist/operations/readExecution.js +24 -16
- package/dist/operations/readExecution.js.map +1 -1
- package/dist/serverInfo/buildServerInfo.d.ts +2 -1
- package/dist/serverInfo/buildServerInfo.js +17 -2
- package/dist/serverInfo/buildServerInfo.js.map +1 -1
- package/dist/serverInfo/types.d.ts +16 -0
- package/docs/CHECKPOINT.md +8 -1
- package/docs/CODE_WALKTHROUGH.md +25 -6
- package/docs/DESIGN.md +17 -4
- package/docs/DIAGNOSTICS.md +167 -0
- package/docs/IMPLEMENTATION_PLAN.md +4 -3
- package/docs/QUICKSTART.md +13 -13
- package/docs/adr/0001-non-configuring-diagnostics.md +5 -0
- package/docs/adr/0002-fail-closed-diagnostic-reservations.md +9 -0
- package/docs/adr/0003-durable-diagnostic-ledger.md +11 -0
- package/docs/adr/0004-offline-operator-attested-release.md +7 -0
- package/docs/adr/0005-multi-destination-ping.md +9 -0
- package/docs/adr/0006-in-memory-timed-diagnostic-capacity.md +21 -0
- package/docs/research/eos-diagnostic-lifecycle.md +86 -0
- package/package.json +1 -1
- package/dist/inventory/writePolicy.d.ts +0 -2
- package/dist/inventory/writePolicy.js +0 -36
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/diagnostics/types.ts"],"names":[],"mappings":""}
|
package/dist/eapi/client.d.ts
CHANGED
|
@@ -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
|
}
|
package/dist/eapi/client.js
CHANGED
|
@@ -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
|
|
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";
|
package/dist/eapi/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/eapi/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EAQzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAsB,MAAM,gBAAgB,CAAC;AAE5E,MAAM,OAAO,UAAU;IACJ,SAAS,CAAgB;IAE1C,YAAY,YAA2B,IAAI,sBAAsB,EAAE;QACjE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,UAAgC,EAChC,QAAkB,EAClB,UAA0B,EAC1B,OAA+B;QAE/B,MAAM,GAAG,GAAG,KAAK,EAAE,MAAwB,EAA+B,EAAE;YAC1E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9E,OAAO,mBAAmB,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC,CAAC;QAC7F,CAAC,CAAC;QAEF,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;YACnD,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,yBAAyB,EAAE,CAAC;gBACtD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,UAAgC,EAChC,QAAkB,EAClB,MAAwB,EACxB,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/eapi/client.ts"],"names":[],"mappings":"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"}
|
package/dist/eapi/types.d.ts
CHANGED
|
@@ -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
|
}
|
package/dist/eapi/types.js.map
CHANGED
|
@@ -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;
|
|
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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"}
|
|
@@ -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":"
|
|
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;
|
package/dist/inventory/policy.js
CHANGED
|
@@ -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
|
|
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;
|
|
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"}
|