@calltelemetry/ct-lab-mcp 0.8.46 → 0.8.48
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/README.md +18 -0
- package/dist/src/tools/canonical-guard.d.ts +1 -1
- package/dist/src/tools/canonical-guard.d.ts.map +1 -1
- package/dist/src/tools/canonical-guard.js +8 -0
- package/dist/src/tools/canonical-guard.js.map +1 -1
- package/dist/src/tools/fleet-metrics.d.ts +26 -0
- package/dist/src/tools/fleet-metrics.d.ts.map +1 -0
- package/dist/src/tools/fleet-metrics.js +181 -0
- package/dist/src/tools/fleet-metrics.js.map +1 -0
- package/dist/src/tools/host-migrate-vm.d.ts +91 -0
- package/dist/src/tools/host-migrate-vm.d.ts.map +1 -0
- package/dist/src/tools/host-migrate-vm.js +138 -0
- package/dist/src/tools/host-migrate-vm.js.map +1 -0
- package/dist/src/tools/index.d.ts +3 -0
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +23 -1
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/provision-tools.d.ts.map +1 -1
- package/dist/src/tools/provision-tools.js +9 -6
- package/dist/src/tools/provision-tools.js.map +1 -1
- package/dist/src/tools/proxmox-host-policy.d.ts +14 -0
- package/dist/src/tools/proxmox-host-policy.d.ts.map +1 -0
- package/dist/src/tools/proxmox-host-policy.js +30 -0
- package/dist/src/tools/proxmox-host-policy.js.map +1 -0
- package/dist/src/tools/sandbox-tools.d.ts +215 -0
- package/dist/src/tools/sandbox-tools.d.ts.map +1 -0
- package/dist/src/tools/sandbox-tools.js +212 -0
- package/dist/src/tools/sandbox-tools.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -357,6 +357,18 @@ Canonical mutation parameters are deliberately explicit:
|
|
|
357
357
|
- `claim_slot` and `provision_vm` require an exact `assetId`, active
|
|
358
358
|
`linearIssue`, and unique `operationId`; apply also requires matching
|
|
359
359
|
`confirmAssetId`.
|
|
360
|
+
- For an interrupted `remote-dev-v1` provision, only canonical `provision_vm`
|
|
361
|
+
can resume the same `alma97-cloud` operation with `recoverIncomplete: true`;
|
|
362
|
+
`repairOperationId` optionally binds the completed `vm_repair` receipt. Keep
|
|
363
|
+
the original asset, host, name, provision operation, VMID, cloud image, and
|
|
364
|
+
reviewed bootstrap manifest. Apply requires their exact confirmations,
|
|
365
|
+
including `confirmBootstrapManifestSha256` and
|
|
366
|
+
`confirmExistingSmbiosUuid`. Facade validation rejects unsupported
|
|
367
|
+
combinations before dispatch, and the canonical CLI rechecks retained
|
|
368
|
+
intent, claim, and live identity before mutation. This does not imply
|
|
369
|
+
development runtime readiness; verify that separately through `lab_dev`.
|
|
370
|
+
`auto_provision_vm`, finalization, alternate sources, and caller-supplied
|
|
371
|
+
fingerprints remain unsupported for this recovery path.
|
|
360
372
|
- For an already-installed `alma97-cloud` VM with an incomplete original
|
|
361
373
|
provision operation, `provision_vm` and `auto_provision_vm` accept
|
|
362
374
|
`finalizeInstalled: true`. This delegates `--finalize-installed` to the
|
|
@@ -382,6 +394,12 @@ Canonical mutation parameters are deliberately explicit:
|
|
|
382
394
|
ownership release. There is no force, host/IP selector or legacy fallback.
|
|
383
395
|
- `purge_slots` delegates only to `claims gc`; age, force, orphan, and VM-name
|
|
384
396
|
shortcuts are rejected.
|
|
397
|
+
|
|
398
|
+
This bridge change is delivered only by a reviewed `@calltelemetry/ct-lab-mcp`
|
|
399
|
+
package release consumed through the host's approved version pin. Source edits
|
|
400
|
+
do not mutate an installed MCP package; after release, advance the canonical
|
|
401
|
+
launcher pin and restart/reconnect the host transport through the normal
|
|
402
|
+
consumer update workflow.
|
|
385
403
|
- `list_expired_vms` classifies live VMs as legal, expiring, expired, dead
|
|
386
404
|
leftover, or protected. It never deletes; terminal Linear-ticket VMs are
|
|
387
405
|
classified (`dead_running` / `dead_stopped`) but ticket terminality alone
|
|
@@ -8,7 +8,7 @@ export declare function canonicalMode(context: ToolContext): boolean;
|
|
|
8
8
|
* the CLI is the authority for the exact asset/lease checks, but merely being
|
|
9
9
|
* configured does not prove that a target is reachable or authorized.
|
|
10
10
|
*/
|
|
11
|
-
export declare const CANONICAL_CREDENTIAL_OPERATIONS: readonly ["lab_dev:doctor", "lab_dev:plan", "lab_dev:prepare", "lab_dev:status", "lab_dev:start", "lab_dev:sync", "lab_dev:stop", "lab_dev:cleanup", "list_hosts", "list_inventory", "vm_repair", "vm_renew", "vm_transfer", "release_slot", "list_expired_vms", "cleanup_expired_vms", "provision_vm", "auto_provision_vm", "proxmox_import_qcow", "appliance_candidate_update", "purge_slots"];
|
|
11
|
+
export declare const CANONICAL_CREDENTIAL_OPERATIONS: readonly ["lab_dev:doctor", "lab_dev:plan", "lab_dev:prepare", "lab_dev:status", "lab_dev:start", "lab_dev:sync", "lab_dev:stop", "lab_dev:cleanup", "list_hosts", "list_inventory", "vm_repair", "vm_renew", "vm_transfer", "release_slot", "list_expired_vms", "cleanup_expired_vms", "provision_vm", "auto_provision_vm", "proxmox_import_qcow", "appliance_candidate_update", "purge_slots", "host_migrate_vm", "sandbox_clone", "sandbox_reset", "ferrum_fleet_metrics"];
|
|
12
12
|
export type CanonicalCredentialReadiness = {
|
|
13
13
|
owner: "canonical_cli" | "legacy_resolver";
|
|
14
14
|
required: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical-guard.d.ts","sourceRoot":"","sources":["../../../src/tools/canonical-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAkD,MAAM,iBAAiB,CAAC;AAEjG,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAE3D;AAED;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,
|
|
1
|
+
{"version":3,"file":"canonical-guard.d.ts","sourceRoot":"","sources":["../../../src/tools/canonical-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAkD,MAAM,iBAAiB,CAAC;AAEjG,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAE3D;AAED;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,+cA6BlC,CAAC;AAEX,MAAM,MAAM,4BAA4B,GAAG;IACzC,KAAK,EAAE,eAAe,GAAG,iBAAiB,CAAC;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,cAAc,GAAG,aAAa,GAAG,4BAA4B,CAAC;IACtE,gBAAgB,EAAE,gBAAgB,GAAG,aAAa,GAAG,2BAA2B,CAAC;IACjF,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,MAAM,CAAC,EAAE,iCAAiC,CAAC;CAC5C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,WAAW,GACnB,4BAA4B,CAoC9B;AAED;;;;;;;;;GASG;AACH,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE;IACJ,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,EACD,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1E,MAAM,EAAE,CAgCV;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CACjD,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EAAE,GAChB,MAAM,CAOR;AAQD;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAoDT;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,CAMzF;AAUD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,CAAC,CAuCzB"}
|
|
@@ -33,6 +33,10 @@ export const CANONICAL_CREDENTIAL_OPERATIONS = [
|
|
|
33
33
|
"proxmox_import_qcow",
|
|
34
34
|
"appliance_candidate_update",
|
|
35
35
|
"purge_slots",
|
|
36
|
+
"host_migrate_vm",
|
|
37
|
+
"sandbox_clone",
|
|
38
|
+
"sandbox_reset",
|
|
39
|
+
"ferrum_fleet_metrics",
|
|
36
40
|
];
|
|
37
41
|
/**
|
|
38
42
|
* Describe credential ownership without probing or pretending that the
|
|
@@ -178,6 +182,10 @@ export function canonicalBridgeOwnsCredentials(context, operation, args) {
|
|
|
178
182
|
// route it through the legacy fleet-wide credential bundle.
|
|
179
183
|
|| operation === "appliance_candidate_update"
|
|
180
184
|
|| operation === "purge_slots"
|
|
185
|
+
|| operation === "host_migrate_vm"
|
|
186
|
+
|| operation === "sandbox_clone"
|
|
187
|
+
|| operation === "sandbox_reset"
|
|
188
|
+
|| operation === "ferrum_fleet_metrics"
|
|
181
189
|
// Claim updates have no legacy handler or fallback. Their CLI validates
|
|
182
190
|
// the exact current owner/lease and owns provider credential resolution.
|
|
183
191
|
|| operation === "vm_renew"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical-guard.js","sourceRoot":"","sources":["../../../src/tools/canonical-guard.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAEjG,MAAM,UAAU,aAAa,CAAC,OAAoB;IAChD,OAAO,OAAO,CAAC,eAAe,EAAE,UAAU,KAAK,IAAI,CAAC;AACtD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC7C,gBAAgB;IAChB,cAAc;IACd,iBAAiB;IACjB,gBAAgB;IAChB,eAAe;IACf,cAAc;IACd,cAAc;IACd,iBAAiB;IACjB,YAAY;IACZ,gBAAgB;IAChB,WAAW;IACX,UAAU;IACV,aAAa;IACb,cAAc;IACd,0EAA0E;IAC1E,wEAAwE;IACxE,+DAA+D;IAC/D,kBAAkB;IAClB,qBAAqB;IACrB,cAAc;IACd,mBAAmB;IACnB,qBAAqB;IACrB,4BAA4B;IAC5B,aAAa;
|
|
1
|
+
{"version":3,"file":"canonical-guard.js","sourceRoot":"","sources":["../../../src/tools/canonical-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: ferrum_fleet_metrics
|
|
3
|
+
*
|
|
4
|
+
* Query fleet-wide hypervisor metrics, dynamic 8GB slot occupancy, and Prometheus
|
|
5
|
+
* capacity alerts across Proxmox standalone nodes (proxmox-lab, proxmox-minis-lab).
|
|
6
|
+
*/
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
import { CallToolResult } from "../types/mcp.js";
|
|
9
|
+
import { ToolContext } from "./list-hosts.js";
|
|
10
|
+
export declare const FerrumFleetMetricsInputShape: {
|
|
11
|
+
host: z.ZodDefault<z.ZodOptional<z.ZodEnum<["proxmox-lab", "proxmox-minis-lab", "proxmox-mini", "all"]>>>;
|
|
12
|
+
format: z.ZodDefault<z.ZodOptional<z.ZodEnum<["summary", "json"]>>>;
|
|
13
|
+
};
|
|
14
|
+
export declare const FerrumFleetMetricsInputSchema: z.ZodObject<{
|
|
15
|
+
host: z.ZodDefault<z.ZodOptional<z.ZodEnum<["proxmox-lab", "proxmox-minis-lab", "proxmox-mini", "all"]>>>;
|
|
16
|
+
format: z.ZodDefault<z.ZodOptional<z.ZodEnum<["summary", "json"]>>>;
|
|
17
|
+
}, "strip", z.ZodTypeAny, {
|
|
18
|
+
host: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "all";
|
|
19
|
+
format: "json" | "summary";
|
|
20
|
+
}, {
|
|
21
|
+
host?: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | "all" | undefined;
|
|
22
|
+
format?: "json" | "summary" | undefined;
|
|
23
|
+
}>;
|
|
24
|
+
export type FerrumFleetMetricsInput = z.infer<typeof FerrumFleetMetricsInputSchema>;
|
|
25
|
+
export declare function handleFerrumFleetMetrics(rawArgs: unknown, context: ToolContext): Promise<CallToolResult>;
|
|
26
|
+
//# sourceMappingURL=fleet-metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleet-metrics.d.ts","sourceRoot":"","sources":["../../../src/tools/fleet-metrics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,cAAc,EAIf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAQ9C,eAAO,MAAM,4BAA4B;;;CAUxC,CAAC;AAEF,eAAO,MAAM,6BAA6B;;;;;;;;;EAAyC,CAAC;AACpF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AA4JpF,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAmDzB"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: ferrum_fleet_metrics
|
|
3
|
+
*
|
|
4
|
+
* Query fleet-wide hypervisor metrics, dynamic 8GB slot occupancy, and Prometheus
|
|
5
|
+
* capacity alerts across Proxmox standalone nodes (proxmox-lab, proxmox-minis-lab).
|
|
6
|
+
*/
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
import { ProxmoxErrorCode, createToolErrorResult, createToolSuccessResult, } from "../types/mcp.js";
|
|
9
|
+
import { canonicalMode } from "./canonical-guard.js";
|
|
10
|
+
import { normalizeProxmoxHost, ProxmoxFleetHostInputSchema, proxmoxSlotPolicy, } from "./proxmox-host-policy.js";
|
|
11
|
+
export const FerrumFleetMetricsInputShape = {
|
|
12
|
+
host: ProxmoxFleetHostInputSchema
|
|
13
|
+
.optional()
|
|
14
|
+
.default("all")
|
|
15
|
+
.describe("Specific host asset ID or 'all' for full fleet aggregate telemetry."),
|
|
16
|
+
format: z
|
|
17
|
+
.enum(["summary", "json"])
|
|
18
|
+
.optional()
|
|
19
|
+
.default("summary")
|
|
20
|
+
.describe("Output format: 'summary' (formatted Markdown report with alert status) or 'json' (raw structured telemetry)."),
|
|
21
|
+
};
|
|
22
|
+
export const FerrumFleetMetricsInputSchema = z.object(FerrumFleetMetricsInputShape);
|
|
23
|
+
function parseCapacityPayload(hostAssetId, stdout) {
|
|
24
|
+
const policy = proxmoxSlotPolicy(hostAssetId);
|
|
25
|
+
const alerts = [];
|
|
26
|
+
try {
|
|
27
|
+
const raw = JSON.parse(stdout);
|
|
28
|
+
// The canonical CLI returns stdout either directly or nested in an outer envelope
|
|
29
|
+
const inner = typeof raw.stdout === "string" ? JSON.parse(raw.stdout) : raw;
|
|
30
|
+
const live = inner.live || {};
|
|
31
|
+
const node = live.node || {};
|
|
32
|
+
const cpuinfo = node.cpuinfo || {};
|
|
33
|
+
const memory = node.memory || {};
|
|
34
|
+
const storageList = live.storage || [];
|
|
35
|
+
const totalMem = Number(memory.total || 0);
|
|
36
|
+
const usedMem = Number(memory.used || 0);
|
|
37
|
+
const freeMem = Number(memory.free || memory.available || 0);
|
|
38
|
+
const memPct = totalMem > 0 ? (usedMem / totalMem) * 100 : 0;
|
|
39
|
+
const lvm = storageList.find((s) => s.storage === policy.storage) || storageList[0] || {
|
|
40
|
+
storage: policy.storage,
|
|
41
|
+
used: 0,
|
|
42
|
+
total: 0,
|
|
43
|
+
avail: 0,
|
|
44
|
+
used_fraction: 0,
|
|
45
|
+
};
|
|
46
|
+
const totalStorage = Number(lvm.total || 0);
|
|
47
|
+
const usedStorage = Number(lvm.used || 0);
|
|
48
|
+
const availStorage = Number(lvm.avail || 0);
|
|
49
|
+
const storagePct = totalStorage > 0 ? (usedStorage / totalStorage) * 100 : Number(lvm.used_fraction || 0) * 100;
|
|
50
|
+
if (memPct >= 85)
|
|
51
|
+
alerts.push(`Memory usage critical: ${memPct.toFixed(1)}% >= 85%`);
|
|
52
|
+
if (storagePct >= 85)
|
|
53
|
+
alerts.push(`Storage pool ${lvm.storage} critical: ${storagePct.toFixed(1)}% >= 85%`);
|
|
54
|
+
return {
|
|
55
|
+
hostAssetId,
|
|
56
|
+
online: true,
|
|
57
|
+
cpuModel: cpuinfo.model || "Unknown CPU",
|
|
58
|
+
cores: Number(cpuinfo.cores || cpuinfo.cpus || 0),
|
|
59
|
+
cpuUsagePct: Number(node.cpu || 0) * 100,
|
|
60
|
+
totalMemoryBytes: totalMem,
|
|
61
|
+
usedMemoryBytes: usedMem,
|
|
62
|
+
freeMemoryBytes: freeMem,
|
|
63
|
+
memoryUsagePct: memPct,
|
|
64
|
+
storagePool: lvm.storage,
|
|
65
|
+
totalStorageBytes: totalStorage,
|
|
66
|
+
usedStorageBytes: usedStorage,
|
|
67
|
+
availStorageBytes: availStorage,
|
|
68
|
+
storageUsagePct: storagePct,
|
|
69
|
+
slotFloor: policy.floor,
|
|
70
|
+
slotHardMax: policy.hardMax,
|
|
71
|
+
alerts,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return {
|
|
76
|
+
hostAssetId,
|
|
77
|
+
online: false,
|
|
78
|
+
cpuModel: "Unavailable",
|
|
79
|
+
cores: 0,
|
|
80
|
+
cpuUsagePct: 0,
|
|
81
|
+
totalMemoryBytes: 0,
|
|
82
|
+
usedMemoryBytes: 0,
|
|
83
|
+
freeMemoryBytes: 0,
|
|
84
|
+
memoryUsagePct: 0,
|
|
85
|
+
storagePool: policy.storage,
|
|
86
|
+
totalStorageBytes: 0,
|
|
87
|
+
usedStorageBytes: 0,
|
|
88
|
+
availStorageBytes: 0,
|
|
89
|
+
storageUsagePct: 0,
|
|
90
|
+
slotFloor: policy.floor,
|
|
91
|
+
slotHardMax: policy.hardMax,
|
|
92
|
+
alerts: ["Failed to parse host capacity telemetry"],
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function unavailableHostMetrics(hostAssetId, alert) {
|
|
97
|
+
const policy = proxmoxSlotPolicy(hostAssetId);
|
|
98
|
+
return {
|
|
99
|
+
hostAssetId,
|
|
100
|
+
online: false,
|
|
101
|
+
cpuModel: "Unknown",
|
|
102
|
+
cores: 0,
|
|
103
|
+
cpuUsagePct: 0,
|
|
104
|
+
totalMemoryBytes: 0,
|
|
105
|
+
usedMemoryBytes: 0,
|
|
106
|
+
freeMemoryBytes: 0,
|
|
107
|
+
memoryUsagePct: 0,
|
|
108
|
+
storagePool: policy.storage,
|
|
109
|
+
totalStorageBytes: 0,
|
|
110
|
+
usedStorageBytes: 0,
|
|
111
|
+
availStorageBytes: 0,
|
|
112
|
+
storageUsagePct: 0,
|
|
113
|
+
slotFloor: policy.floor,
|
|
114
|
+
slotHardMax: policy.hardMax,
|
|
115
|
+
alerts: [alert],
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function formatBytes(bytes) {
|
|
119
|
+
if (bytes === 0)
|
|
120
|
+
return "0 GB";
|
|
121
|
+
const gb = bytes / (1024 * 1024 * 1024);
|
|
122
|
+
return `${gb.toFixed(1)} GB`;
|
|
123
|
+
}
|
|
124
|
+
function formatSummary(metrics) {
|
|
125
|
+
const lines = [
|
|
126
|
+
"# Ferrum Proxmox Fleet Metrics & Telemetry",
|
|
127
|
+
"",
|
|
128
|
+
"| Host Asset ID | Status | Cores | CPU % | Memory (Used / Total) | RAM % | Storage (Used / Total) | Pool % | 8GB Slots (Floor/Max) | Alerts |",
|
|
129
|
+
"| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |",
|
|
130
|
+
];
|
|
131
|
+
for (const m of metrics) {
|
|
132
|
+
const status = m.online ? "🟢 Online" : "🔴 Offline";
|
|
133
|
+
const alertText = m.alerts.length > 0 ? `⚠️ ${m.alerts.join("; ")}` : "✅ Healthy";
|
|
134
|
+
lines.push(`| **${m.hostAssetId}** | ${status} | ${m.cores} | ${m.cpuUsagePct.toFixed(1)}% | ${formatBytes(m.usedMemoryBytes)} / ${formatBytes(m.totalMemoryBytes)} | ${m.memoryUsagePct.toFixed(1)}% | ${formatBytes(m.usedStorageBytes)} / ${formatBytes(m.totalStorageBytes)} | ${m.storageUsagePct.toFixed(1)}% | ${m.slotFloor} / ${m.slotHardMax} | ${alertText} |`);
|
|
135
|
+
}
|
|
136
|
+
lines.push("");
|
|
137
|
+
lines.push("### Prometheus Alert Policies");
|
|
138
|
+
lines.push("- **FerrumHostMemoryHigh**: Evaluates `(1 - free/total) >= 0.85` for 5m. Threshold: 85%.");
|
|
139
|
+
lines.push("- **FerrumHostStorageHigh**: Evaluates storage pool utilization `>= 0.85`. Threshold: 85%.");
|
|
140
|
+
lines.push("- **FerrumFleetDown**: Triggers if either standalone Proxmox node goes unreachable.");
|
|
141
|
+
return lines.join("\n");
|
|
142
|
+
}
|
|
143
|
+
export async function handleFerrumFleetMetrics(rawArgs, context) {
|
|
144
|
+
const parsed = FerrumFleetMetricsInputSchema.safeParse(rawArgs);
|
|
145
|
+
if (!parsed.success) {
|
|
146
|
+
return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, parsed.error.errors.map((e) => `${e.path.join(".")}: ${e.message}`).join("; "));
|
|
147
|
+
}
|
|
148
|
+
if (!canonicalMode(context)) {
|
|
149
|
+
return createToolErrorResult("CANONICAL_OPERATION_REQUIRES_BRIDGE", "ferrum fleet metrics requires canonical lab mode");
|
|
150
|
+
}
|
|
151
|
+
const { host, format } = parsed.data;
|
|
152
|
+
const targetHosts = [];
|
|
153
|
+
if (host === "all") {
|
|
154
|
+
targetHosts.push("proxmox-lab", "proxmox-minis-lab");
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
targetHosts.push(normalizeProxmoxHost(host));
|
|
158
|
+
}
|
|
159
|
+
const results = [];
|
|
160
|
+
for (const h of targetHosts) {
|
|
161
|
+
try {
|
|
162
|
+
const res = await context.canonicalBridge.run(["host", "capacity", "--asset-id", h]);
|
|
163
|
+
if (res.exitCode === 0) {
|
|
164
|
+
results.push(parseCapacityPayload(h, res.stdout));
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
results.push(unavailableHostMetrics(h, `Host unreachable or capacity query failed: ${res.stderr || "non-zero exit"}`));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
results.push(unavailableHostMetrics(h, err instanceof Error ? err.message : String(err)));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (format === "json") {
|
|
175
|
+
return createToolSuccessResult(JSON.stringify({ schema: "calltelemetry-ferrum-fleet-metrics/v1", metrics: results }, null, 2), {
|
|
176
|
+
metrics: results,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
return createToolSuccessResult(formatSummary(results), { metrics: results });
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=fleet-metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleet-metrics.js","sourceRoot":"","sources":["../../../src/tools/fleet-metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical Proxmox cross-node cold VM migration MCP facade.
|
|
3
|
+
* Wraps canonical `lab-inventory host migrate-vm` with dry-run planning,
|
|
4
|
+
* cold-state assertions, dynamic slot quota pre-checks, and ADR 0506 journal state machine.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { CallToolResult } from "../types/mcp.js";
|
|
8
|
+
import { ToolContext } from "./list-hosts.js";
|
|
9
|
+
export declare const HostMigrateVmInputShape: {
|
|
10
|
+
assetId: z.ZodString;
|
|
11
|
+
targetHost: z.ZodEnum<["proxmox-lab", "proxmox-minis-lab", "proxmox-mini"]>;
|
|
12
|
+
operationId: z.ZodString;
|
|
13
|
+
apply: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
14
|
+
confirmAssetId: z.ZodOptional<z.ZodString>;
|
|
15
|
+
confirmTargetHost: z.ZodOptional<z.ZodEnum<["proxmox-lab", "proxmox-minis-lab", "proxmox-mini"]>>;
|
|
16
|
+
planDigest: z.ZodOptional<z.ZodString>;
|
|
17
|
+
targetStorage: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
18
|
+
targetBridge: z.ZodOptional<z.ZodString>;
|
|
19
|
+
targetVmid: z.ZodOptional<z.ZodNumber>;
|
|
20
|
+
receiptFile: z.ZodOptional<z.ZodString>;
|
|
21
|
+
lockTimeoutSeconds: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
22
|
+
};
|
|
23
|
+
export declare const HostMigrateVmInputSchema: z.ZodEffects<z.ZodObject<{
|
|
24
|
+
assetId: z.ZodString;
|
|
25
|
+
targetHost: z.ZodEnum<["proxmox-lab", "proxmox-minis-lab", "proxmox-mini"]>;
|
|
26
|
+
operationId: z.ZodString;
|
|
27
|
+
apply: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
28
|
+
confirmAssetId: z.ZodOptional<z.ZodString>;
|
|
29
|
+
confirmTargetHost: z.ZodOptional<z.ZodEnum<["proxmox-lab", "proxmox-minis-lab", "proxmox-mini"]>>;
|
|
30
|
+
planDigest: z.ZodOptional<z.ZodString>;
|
|
31
|
+
targetStorage: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
32
|
+
targetBridge: z.ZodOptional<z.ZodString>;
|
|
33
|
+
targetVmid: z.ZodOptional<z.ZodNumber>;
|
|
34
|
+
receiptFile: z.ZodOptional<z.ZodString>;
|
|
35
|
+
lockTimeoutSeconds: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
36
|
+
}, "strip", z.ZodTypeAny, {
|
|
37
|
+
assetId: string;
|
|
38
|
+
operationId: string;
|
|
39
|
+
apply: boolean;
|
|
40
|
+
targetHost: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab";
|
|
41
|
+
lockTimeoutSeconds: number;
|
|
42
|
+
targetStorage: string;
|
|
43
|
+
receiptFile?: string | undefined;
|
|
44
|
+
confirmAssetId?: string | undefined;
|
|
45
|
+
planDigest?: string | undefined;
|
|
46
|
+
confirmTargetHost?: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | undefined;
|
|
47
|
+
targetBridge?: string | undefined;
|
|
48
|
+
targetVmid?: number | undefined;
|
|
49
|
+
}, {
|
|
50
|
+
assetId: string;
|
|
51
|
+
operationId: string;
|
|
52
|
+
targetHost: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab";
|
|
53
|
+
apply?: boolean | undefined;
|
|
54
|
+
receiptFile?: string | undefined;
|
|
55
|
+
confirmAssetId?: string | undefined;
|
|
56
|
+
lockTimeoutSeconds?: number | undefined;
|
|
57
|
+
planDigest?: string | undefined;
|
|
58
|
+
confirmTargetHost?: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | undefined;
|
|
59
|
+
targetStorage?: string | undefined;
|
|
60
|
+
targetBridge?: string | undefined;
|
|
61
|
+
targetVmid?: number | undefined;
|
|
62
|
+
}>, {
|
|
63
|
+
assetId: string;
|
|
64
|
+
operationId: string;
|
|
65
|
+
apply: boolean;
|
|
66
|
+
targetHost: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab";
|
|
67
|
+
lockTimeoutSeconds: number;
|
|
68
|
+
targetStorage: string;
|
|
69
|
+
receiptFile?: string | undefined;
|
|
70
|
+
confirmAssetId?: string | undefined;
|
|
71
|
+
planDigest?: string | undefined;
|
|
72
|
+
confirmTargetHost?: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | undefined;
|
|
73
|
+
targetBridge?: string | undefined;
|
|
74
|
+
targetVmid?: number | undefined;
|
|
75
|
+
}, {
|
|
76
|
+
assetId: string;
|
|
77
|
+
operationId: string;
|
|
78
|
+
targetHost: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab";
|
|
79
|
+
apply?: boolean | undefined;
|
|
80
|
+
receiptFile?: string | undefined;
|
|
81
|
+
confirmAssetId?: string | undefined;
|
|
82
|
+
lockTimeoutSeconds?: number | undefined;
|
|
83
|
+
planDigest?: string | undefined;
|
|
84
|
+
confirmTargetHost?: "proxmox-lab" | "proxmox-mini" | "proxmox-minis-lab" | undefined;
|
|
85
|
+
targetStorage?: string | undefined;
|
|
86
|
+
targetBridge?: string | undefined;
|
|
87
|
+
targetVmid?: number | undefined;
|
|
88
|
+
}>;
|
|
89
|
+
export type HostMigrateVmInput = z.infer<typeof HostMigrateVmInputSchema>;
|
|
90
|
+
export declare function handleHostMigrateVm(rawArgs: unknown, context: ToolContext): Promise<CallToolResult>;
|
|
91
|
+
//# sourceMappingURL=host-migrate-vm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-migrate-vm.d.ts","sourceRoot":"","sources":["../../../src/tools/host-migrate-vm.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAA2C,MAAM,iBAAiB,CAAC;AAE1F,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAM9C,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;CA0DnC,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BjC,CAAC;AAEL,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAI1E,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAuDzB"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical Proxmox cross-node cold VM migration MCP facade.
|
|
3
|
+
* Wraps canonical `lab-inventory host migrate-vm` with dry-run planning,
|
|
4
|
+
* cold-state assertions, dynamic slot quota pre-checks, and ADR 0506 journal state machine.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { ProxmoxErrorCode, createToolErrorResult } from "../types/mcp.js";
|
|
8
|
+
import { canonicalMode, runCanonicalOperation } from "./canonical-guard.js";
|
|
9
|
+
import { normalizeProxmoxHost, ProxmoxHostInputSchema, } from "./proxmox-host-policy.js";
|
|
10
|
+
export const HostMigrateVmInputShape = {
|
|
11
|
+
assetId: z
|
|
12
|
+
.string()
|
|
13
|
+
.min(1)
|
|
14
|
+
.describe("Canonical VM asset ID to migrate (e.g. 'ct-appliance-uat-105')."),
|
|
15
|
+
targetHost: ProxmoxHostInputSchema
|
|
16
|
+
.describe("Canonical target Proxmox host asset ID (e.g. 'proxmox-minis-lab')."),
|
|
17
|
+
operationId: z
|
|
18
|
+
.string()
|
|
19
|
+
.regex(/^[A-Za-z0-9][A-Za-z0-9._:-]{7,127}$/)
|
|
20
|
+
.describe("Unique idempotency ID for this migration transaction (8-128 characters)."),
|
|
21
|
+
apply: z
|
|
22
|
+
.boolean()
|
|
23
|
+
.optional()
|
|
24
|
+
.default(false)
|
|
25
|
+
.describe("Omit for a dry-run plan. True executes guarded cold migration using native Proxmox qm remote-migrate."),
|
|
26
|
+
confirmAssetId: z
|
|
27
|
+
.string()
|
|
28
|
+
.min(1)
|
|
29
|
+
.optional()
|
|
30
|
+
.describe("Required with apply=true and must exactly match assetId."),
|
|
31
|
+
confirmTargetHost: ProxmoxHostInputSchema
|
|
32
|
+
.optional()
|
|
33
|
+
.describe("Required with apply=true and must exactly match targetHost."),
|
|
34
|
+
planDigest: z
|
|
35
|
+
.string()
|
|
36
|
+
.regex(/^[a-f0-9]{64}$/i)
|
|
37
|
+
.optional()
|
|
38
|
+
.describe("Required with apply=true and must match the latest dry-run plan digest."),
|
|
39
|
+
targetStorage: z
|
|
40
|
+
.string()
|
|
41
|
+
.min(1)
|
|
42
|
+
.optional()
|
|
43
|
+
.default("local-lvm")
|
|
44
|
+
.describe("Target storage pool on destination host (default: 'local-lvm')."),
|
|
45
|
+
targetBridge: z
|
|
46
|
+
.string()
|
|
47
|
+
.min(1)
|
|
48
|
+
.optional()
|
|
49
|
+
.describe("Target network bridge on destination host (e.g. 'vmbr0' or 'vmbr1')."),
|
|
50
|
+
targetVmid: z
|
|
51
|
+
.number()
|
|
52
|
+
.int()
|
|
53
|
+
.positive()
|
|
54
|
+
.optional()
|
|
55
|
+
.describe("Target VMID on destination host (default: source VMID or next available dynamic VMID)."),
|
|
56
|
+
receiptFile: z
|
|
57
|
+
.string()
|
|
58
|
+
.min(1)
|
|
59
|
+
.optional()
|
|
60
|
+
.describe("Optional path for a copy of the plan or durable migration receipt."),
|
|
61
|
+
lockTimeoutSeconds: z
|
|
62
|
+
.number()
|
|
63
|
+
.min(0)
|
|
64
|
+
.max(300)
|
|
65
|
+
.optional()
|
|
66
|
+
.default(30)
|
|
67
|
+
.describe("Coordinator lock timeout in seconds (default: 30)."),
|
|
68
|
+
};
|
|
69
|
+
export const HostMigrateVmInputSchema = z
|
|
70
|
+
.object(HostMigrateVmInputShape)
|
|
71
|
+
.superRefine((value, context) => {
|
|
72
|
+
if (!value.apply)
|
|
73
|
+
return;
|
|
74
|
+
if (value.confirmAssetId !== value.assetId) {
|
|
75
|
+
context.addIssue({
|
|
76
|
+
code: z.ZodIssueCode.custom,
|
|
77
|
+
path: ["confirmAssetId"],
|
|
78
|
+
message: "must exactly match assetId when apply=true",
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
if (!value.confirmTargetHost
|
|
82
|
+
|| normalizeProxmoxHost(value.confirmTargetHost) !== normalizeProxmoxHost(value.targetHost)) {
|
|
83
|
+
context.addIssue({
|
|
84
|
+
code: z.ZodIssueCode.custom,
|
|
85
|
+
path: ["confirmTargetHost"],
|
|
86
|
+
message: "must exactly match targetHost when apply=true",
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
if (!value.planDigest) {
|
|
90
|
+
context.addIssue({
|
|
91
|
+
code: z.ZodIssueCode.custom,
|
|
92
|
+
path: ["planDigest"],
|
|
93
|
+
message: "is required when apply=true",
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
const MIGRATION_TRANSACTION_TIMEOUT_MS = 10 * 60 * 1000;
|
|
98
|
+
export async function handleHostMigrateVm(rawArgs, context) {
|
|
99
|
+
const parsed = HostMigrateVmInputSchema.safeParse(rawArgs);
|
|
100
|
+
if (!parsed.success) {
|
|
101
|
+
return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, parsed.error.errors
|
|
102
|
+
.map((error) => `${error.path.join(".")}: ${error.message}`)
|
|
103
|
+
.join("; "));
|
|
104
|
+
}
|
|
105
|
+
if (!canonicalMode(context)) {
|
|
106
|
+
return createToolErrorResult("CANONICAL_OPERATION_REQUIRES_BRIDGE", "host migrate VM requires canonical lab mode; the Node slot manager does not perform cross-node migration");
|
|
107
|
+
}
|
|
108
|
+
const value = parsed.data;
|
|
109
|
+
const normalizedTargetHost = normalizeProxmoxHost(value.targetHost);
|
|
110
|
+
const normalizedConfirmTargetHost = value.confirmTargetHost
|
|
111
|
+
? normalizeProxmoxHost(value.confirmTargetHost)
|
|
112
|
+
: undefined;
|
|
113
|
+
const args = [
|
|
114
|
+
"host",
|
|
115
|
+
"migrate-vm",
|
|
116
|
+
"--asset-id",
|
|
117
|
+
value.assetId,
|
|
118
|
+
"--target-host",
|
|
119
|
+
normalizedTargetHost,
|
|
120
|
+
"--operation-id",
|
|
121
|
+
value.operationId,
|
|
122
|
+
];
|
|
123
|
+
if (value.targetStorage)
|
|
124
|
+
args.push("--target-storage", value.targetStorage);
|
|
125
|
+
if (value.targetBridge)
|
|
126
|
+
args.push("--target-bridge", value.targetBridge);
|
|
127
|
+
if (value.targetVmid !== undefined)
|
|
128
|
+
args.push("--target-vmid", String(value.targetVmid));
|
|
129
|
+
if (value.lockTimeoutSeconds !== undefined)
|
|
130
|
+
args.push("--lock-timeout-seconds", String(value.lockTimeoutSeconds));
|
|
131
|
+
if (value.receiptFile)
|
|
132
|
+
args.push("--receipt-file", value.receiptFile);
|
|
133
|
+
if (value.apply) {
|
|
134
|
+
args.push("--apply", "--confirm-asset-id", value.confirmAssetId, "--confirm-target-host", normalizedConfirmTargetHost, "--plan-digest", value.planDigest);
|
|
135
|
+
}
|
|
136
|
+
return runCanonicalOperation(context.canonicalBridge, "host_migrate_vm", args, MIGRATION_TRANSACTION_TIMEOUT_MS);
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=host-migrate-vm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-migrate-vm.js","sourceRoot":"","sources":["../../../src/tools/host-migrate-vm.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,5 +50,8 @@ export * from "./sha-channel.js";
|
|
|
50
50
|
export * from "./host-maintenance-shutdown.js";
|
|
51
51
|
export * from "./appliance-candidate-update.js";
|
|
52
52
|
export * from "./appliance-candidate-retire.js";
|
|
53
|
+
export * from "./host-migrate-vm.js";
|
|
54
|
+
export * from "./sandbox-tools.js";
|
|
55
|
+
export * from "./fleet-metrics.js";
|
|
53
56
|
export declare function registerAllTools(mcpServer: McpServer, context: ToolContext): void;
|
|
54
57
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAIL,WAAW,EACZ,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAIL,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAoQzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AAYnC,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAmwBjF"}
|