@calltelemetry/ct-lab-mcp 0.8.45 → 0.8.47
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/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 +22 -0
- 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 +18 -15
- 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
|
@@ -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"}
|
package/dist/src/tools/index.js
CHANGED
|
@@ -51,6 +51,9 @@ import { HostMaintenanceShutdownInputShape, handleHostMaintenanceShutdown, } fro
|
|
|
51
51
|
import { CubeListInputShape, handleCubeList, CubeStatusInputShape, handleCubeStatus, CubeExecInputShape, handleCubeExec, CubeConfigInputShape, handleCubeConfig, CubeDialpeerShowInputShape, handleCubeDialpeerShow, CubeDialpeerApplyInputShape, handleCubeDialpeerApply, CubeXccEnableInputShape, handleCubeXccEnable, CubeXccStatusInputShape, handleCubeXccStatus, CubeIosSnapshotInputShape, handleCubeIosSnapshot, } from "./cube-canonical.js";
|
|
52
52
|
import { ApplyManifestInputShape, handleApplyManifest, GetManifestInputShape, handleGetManifest, DeleteManifestInputShape, handleDeleteManifest, RenewManifestInputShape, handleRenewManifest, ListManifestsInputShape, handleListManifests, } from "./manifest-tools.js";
|
|
53
53
|
import { ApplyLicenseInputShape, handleApplyLicense, } from "./license-tools.js";
|
|
54
|
+
import { HostMigrateVmInputShape, handleHostMigrateVm, } from "./host-migrate-vm.js";
|
|
55
|
+
import { SandboxCloneInputShape, handleSandboxClone, SandboxResetInputShape, handleSandboxReset, } from "./sandbox-tools.js";
|
|
56
|
+
import { FerrumFleetMetricsInputShape, handleFerrumFleetMetrics, } from "./fleet-metrics.js";
|
|
54
57
|
import { canonicalBridgeOwnsCredentials, canonicalMode, canonicalOperationBlocked, } from "./canonical-guard.js";
|
|
55
58
|
import { createToolErrorResult } from "../types/mcp.js";
|
|
56
59
|
import { buildProvenance, stampProvenance } from "../provenance.js";
|
|
@@ -90,6 +93,9 @@ export * from "./sha-channel.js";
|
|
|
90
93
|
export * from "./host-maintenance-shutdown.js";
|
|
91
94
|
export * from "./appliance-candidate-update.js";
|
|
92
95
|
export * from "./appliance-candidate-retire.js";
|
|
96
|
+
export * from "./host-migrate-vm.js";
|
|
97
|
+
export * from "./sandbox-tools.js";
|
|
98
|
+
export * from "./fleet-metrics.js";
|
|
93
99
|
export function registerAllTools(mcpServer, context) {
|
|
94
100
|
// This registry uses only Zod 3 object shapes and the four-argument tool
|
|
95
101
|
// form. Keep schema-to-handler inference without expanding the SDK's
|
|
@@ -396,5 +402,21 @@ export function registerAllTools(mcpServer, context) {
|
|
|
396
402
|
server.tool("renew_license", "Renews an existing Call Telemetry license on a target appliance VM by minting and applying a fresh signed token with specified duration.", ApplyLicenseInputShape, async (args) => {
|
|
397
403
|
return handleApplyLicense(args, context);
|
|
398
404
|
});
|
|
405
|
+
// 39. host_migrate_vm
|
|
406
|
+
server.tool("host_migrate_vm", "Plan or execute guarded cold VM migration between standalone Proxmox hosts using native qm remote-migrate. Cold migration only: source VM must be stopped due to CPU heterogeneity.", HostMigrateVmInputShape, async (args) => {
|
|
407
|
+
return handleHostMigrateVm(args, context);
|
|
408
|
+
});
|
|
409
|
+
// 40. sandbox_clone
|
|
410
|
+
server.tool("sandbox_clone", "Spawn an ephemeral agent sandbox VM from gold master template in sub-15s (linked clone). Supports AlmaLinux 9.7 (authoritative CallTelemetry master) and Ubuntu 24.04.", SandboxCloneInputShape, async (args) => {
|
|
411
|
+
return handleSandboxClone(args, context);
|
|
412
|
+
});
|
|
413
|
+
// 41. sandbox_reset
|
|
414
|
+
server.tool("sandbox_reset", "Rollback an ephemeral agent sandbox VM to its baseline clean-state snapshot in sub-15s.", SandboxResetInputShape, async (args) => {
|
|
415
|
+
return handleSandboxReset(args, context);
|
|
416
|
+
});
|
|
417
|
+
// 42. ferrum_fleet_metrics
|
|
418
|
+
server.tool("ferrum_fleet_metrics", "Query fleet-wide hypervisor telemetry, dynamic 8GB slot occupancy, and Prometheus capacity alert readiness across Proxmox standalone nodes.", FerrumFleetMetricsInputShape, async (args) => {
|
|
419
|
+
return handleFerrumFleetMetrics(args, context);
|
|
420
|
+
});
|
|
399
421
|
}
|
|
400
422
|
//# sourceMappingURL=index.js.map
|