@calltelemetry/ct-lab-mcp 0.8.50 → 0.8.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +11 -0
  2. package/dist/src/appliance/commands.d.ts.map +1 -1
  3. package/dist/src/appliance/commands.js +39 -0
  4. package/dist/src/appliance/commands.js.map +1 -1
  5. package/dist/src/appliance/types.d.ts +4 -1
  6. package/dist/src/appliance/types.d.ts.map +1 -1
  7. package/dist/src/appliance/types.js.map +1 -1
  8. package/dist/src/tools/appliance-claim-tools.d.ts +188 -0
  9. package/dist/src/tools/appliance-claim-tools.d.ts.map +1 -0
  10. package/dist/src/tools/appliance-claim-tools.js +428 -0
  11. package/dist/src/tools/appliance-claim-tools.js.map +1 -0
  12. package/dist/src/tools/appliance-id.d.ts +33 -0
  13. package/dist/src/tools/appliance-id.d.ts.map +1 -0
  14. package/dist/src/tools/appliance-id.js +88 -0
  15. package/dist/src/tools/appliance-id.js.map +1 -0
  16. package/dist/src/tools/index.d.ts +4 -0
  17. package/dist/src/tools/index.d.ts.map +1 -1
  18. package/dist/src/tools/index.js +41 -1
  19. package/dist/src/tools/index.js.map +1 -1
  20. package/dist/src/tools/license-tools.d.ts +88 -0
  21. package/dist/src/tools/license-tools.d.ts.map +1 -1
  22. package/dist/src/tools/license-tools.js +253 -0
  23. package/dist/src/tools/license-tools.js.map +1 -1
  24. package/dist/src/tools/sideload-runner.d.ts +56 -0
  25. package/dist/src/tools/sideload-runner.d.ts.map +1 -0
  26. package/dist/src/tools/sideload-runner.js +175 -0
  27. package/dist/src/tools/sideload-runner.js.map +1 -0
  28. package/dist/src/tools/verify-demo.d.ts +125 -0
  29. package/dist/src/tools/verify-demo.d.ts.map +1 -0
  30. package/dist/src/tools/verify-demo.js +435 -0
  31. package/dist/src/tools/verify-demo.js.map +1 -0
  32. package/package.json +1 -1
@@ -0,0 +1,428 @@
1
+ /**
2
+ * ApplianceClaim Kubernetes CRD MCP Tools
3
+ *
4
+ * apiVersion: calltelemetry.com/v1alpha1
5
+ * kind: ApplianceClaim
6
+ *
7
+ * Provides declarative inspection, provisioning, and teardown of appliance claims
8
+ * managed by ct-appliance-operator in Kubernetes (namespace: ct-lab).
9
+ */
10
+ import { z } from "zod";
11
+ import { execFile } from "node:child_process";
12
+ import { promisify } from "node:util";
13
+ import { fetch, Agent } from "undici";
14
+ import * as fs from "node:fs";
15
+ import { ProxmoxErrorCode, createToolErrorResult } from "../types/mcp.js";
16
+ import { logger } from "../utils/logger.js";
17
+ const execFileAsync = promisify(execFile);
18
+ export const RECOGNIZED_CHANNELS = ["stable", "beta", "rc", "candidate", "dev", "edge"];
19
+ export function resolveAndValidateChannel(version, trainOrChannel) {
20
+ const isPrerelease = version.includes("-rc") || version.includes("-dev") || version.includes("-beta") || version.includes("-candidate");
21
+ const is087Line = version.startsWith("0.8.7");
22
+ let channel;
23
+ if (!trainOrChannel) {
24
+ if (isPrerelease) {
25
+ channel = "rc";
26
+ }
27
+ else if (is087Line) {
28
+ channel = "beta";
29
+ }
30
+ else {
31
+ channel = "stable";
32
+ }
33
+ }
34
+ else {
35
+ channel = trainOrChannel.toLowerCase().trim();
36
+ }
37
+ if (!RECOGNIZED_CHANNELS.includes(channel)) {
38
+ throw new Error(`Invalid release train/channel '${trainOrChannel}'. Must be one of: ${RECOGNIZED_CHANNELS.join(", ")}`);
39
+ }
40
+ if (channel === "stable") {
41
+ if (is087Line) {
42
+ throw new Error(`Release Channel Violation: Version '${version}' cannot be provisioned on channel 'stable'. ` +
43
+ `The 0.8.7 line does not have a GA stable release; use channel 'beta' or 'rc'.`);
44
+ }
45
+ if (isPrerelease) {
46
+ throw new Error(`Release Channel Violation: Pre-release version '${version}' cannot be deployed on channel 'stable'. ` +
47
+ `Use channel 'rc' or 'candidate'.`);
48
+ }
49
+ }
50
+ return channel;
51
+ }
52
+ export const ListApplianceClaimsInputShape = {
53
+ namespace: z.string().optional().default("ct-lab").describe("Kubernetes namespace (default: 'ct-lab')."),
54
+ phase: z.enum(["Pending", "Provisioning", "Bootstrapping", "Ready", "Failed", "Closed"]).optional().describe("Filter by phase."),
55
+ claimType: z.enum(["dynamic", "fixture"]).optional().describe("Filter by claimType ('dynamic' vs 'fixture').")
56
+ };
57
+ export const ListApplianceClaimsInputSchema = z.object(ListApplianceClaimsInputShape);
58
+ export const GetApplianceClaimInputShape = {
59
+ name: z.string().min(1).describe("Name of the ApplianceClaim resource (metadata.name)."),
60
+ namespace: z.string().optional().default("ct-lab").describe("Kubernetes namespace (default: 'ct-lab').")
61
+ };
62
+ export const GetApplianceClaimInputSchema = z.object(GetApplianceClaimInputShape);
63
+ export const CreateApplianceClaimInputShape = {
64
+ name: z.string().optional().describe("Name of the ApplianceClaim resource (metadata.name). Auto-generated if omitted."),
65
+ namespace: z.string().optional().default("ct-lab").describe("Kubernetes namespace (default: 'ct-lab')."),
66
+ targetIp: z.string().regex(/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/, "Must be valid IPv4 address").describe("Target IP address for the appliance VM."),
67
+ vmid: z.number().int().min(100).max(8999).optional().describe("Proxmox VMID for the appliance."),
68
+ node: z.string().optional().default("minis").describe("Proxmox node name (default: 'minis')."),
69
+ version: z.string().optional().default("0.8.6.27").describe("Target appliance version (default: '0.8.6.27')."),
70
+ train: z.enum(["stable", "beta", "rc", "candidate", "dev", "edge"]).optional().describe("Release channel / train. Auto-resolved if omitted."),
71
+ linearIssue: z.string().optional().describe("Associated Linear issue (e.g. 'QA-480', 'UAT-1728')."),
72
+ preset: z.enum(["comprehensive_demo", "standard_demo", "minimal_demo", "empty"]).optional().default("comprehensive_demo").describe("Scenario preset to bootstrap (default: 'comprehensive_demo')."),
73
+ ttlHours: z.number().int().min(0).max(8760).optional().default(24).describe("TTL in hours before automated scavenger cleanup (default: 24, 0 = no expiry)."),
74
+ licenseTier: z.enum(["Demo", "Community", "Standard", "Enterprise"]).optional().default("Demo").describe("License tier (default: 'Demo')."),
75
+ licenseDays: z.number().int().min(1).max(3650).optional().default(90).describe("License duration in days (default: 90)."),
76
+ adminEmail: z.string().email().optional().default("demo@calltelemetry.com").describe("Admin user email."),
77
+ containerOverrides: z.record(z.string()).optional().describe("Container git hash or image overrides (e.g. { web: '3f0962a4', vue: 'a67c9610' })."),
78
+ dryRun: z.boolean().optional().default(false).describe("Validate inputs and simulate creation without mutating Kubernetes.")
79
+ };
80
+ export const CreateApplianceClaimInputSchema = z.object(CreateApplianceClaimInputShape);
81
+ export const DeleteApplianceClaimInputShape = {
82
+ name: z.string().min(1).describe("Name of the ApplianceClaim resource to delete."),
83
+ namespace: z.string().optional().default("ct-lab").describe("Kubernetes namespace (default: 'ct-lab').")
84
+ };
85
+ export const DeleteApplianceClaimInputSchema = z.object(DeleteApplianceClaimInputShape);
86
+ const K8S_IN_CLUSTER_TOKEN = "/var/run/secrets/kubernetes.io/serviceaccount/token";
87
+ const K8S_IN_CLUSTER_CA = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt";
88
+ async function queryKubernetesApi(path, options = {}) {
89
+ const isCluster = fs.existsSync(K8S_IN_CLUSTER_TOKEN);
90
+ if (isCluster) {
91
+ const host = process.env.KUBERNETES_SERVICE_HOST || "kubernetes.default.svc";
92
+ const port = process.env.KUBERNETES_SERVICE_PORT || "443";
93
+ const token = fs.readFileSync(K8S_IN_CLUSTER_TOKEN, "utf-8").trim();
94
+ const ca = fs.existsSync(K8S_IN_CLUSTER_CA) ? fs.readFileSync(K8S_IN_CLUSTER_CA) : undefined;
95
+ const agent = new Agent({
96
+ connect: {
97
+ ca,
98
+ rejectUnauthorized: false
99
+ }
100
+ });
101
+ const url = `https://${host}:${port}${path}`;
102
+ const res = await fetch(url, {
103
+ method: options.method || "GET",
104
+ headers: {
105
+ Authorization: `Bearer ${token}`,
106
+ "Content-Type": "application/json"
107
+ },
108
+ body: options.body ? JSON.stringify(options.body) : undefined,
109
+ dispatcher: agent
110
+ });
111
+ if (!res.ok) {
112
+ const errText = await res.text().catch(() => "");
113
+ throw new Error(`Kubernetes API error (${res.status}): ${errText}`);
114
+ }
115
+ return res.json();
116
+ }
117
+ // Fallback to kubectl
118
+ return null;
119
+ }
120
+ export async function handleListApplianceClaims(args, _context) {
121
+ const parsed = ListApplianceClaimsInputSchema.safeParse(args);
122
+ if (!parsed.success) {
123
+ const issues = parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
124
+ return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, issues);
125
+ }
126
+ const { namespace, phase, claimType } = parsed.data;
127
+ try {
128
+ let items = [];
129
+ // Try in-cluster API first
130
+ const apiPath = `/apis/calltelemetry.com/v1alpha1/namespaces/${namespace}/applianceclaims`;
131
+ let apiRes = null;
132
+ let apiError = null;
133
+ try {
134
+ apiRes = await queryKubernetesApi(apiPath);
135
+ }
136
+ catch (err) {
137
+ apiError = err.message;
138
+ logger.warn(`In-cluster Kubernetes API call to '${apiPath}' failed: ${err.message}`);
139
+ }
140
+ if (apiRes && apiRes.items) {
141
+ items = apiRes.items;
142
+ }
143
+ else {
144
+ // Execute via kubectl fallback
145
+ try {
146
+ const { stdout } = await execFileAsync("kubectl", [
147
+ "get",
148
+ "applianceclaims",
149
+ "-n",
150
+ namespace,
151
+ "-o",
152
+ "json"
153
+ ]);
154
+ const parsedK8s = JSON.parse(stdout);
155
+ items = parsedK8s.items || [];
156
+ }
157
+ catch (kubectlErr) {
158
+ if (apiError) {
159
+ throw new Error(`In-cluster Kubernetes API error: ${apiError}. Kubectl fallback error: ${kubectlErr.message}`);
160
+ }
161
+ throw kubectlErr;
162
+ }
163
+ }
164
+ if (phase) {
165
+ items = items.filter((item) => item.status?.phase === phase);
166
+ }
167
+ if (claimType) {
168
+ items = items.filter((item) => (item.spec?.claimType || "dynamic") === claimType);
169
+ }
170
+ const summary = items.map((claim) => ({
171
+ name: claim.metadata?.name,
172
+ phase: claim.status?.phase || "Unknown",
173
+ ip: claim.spec?.targetIp,
174
+ vmid: claim.spec?.vmid,
175
+ node: claim.spec?.node || "minis",
176
+ version: claim.spec?.version,
177
+ train: claim.spec?.train,
178
+ claimType: claim.spec?.claimType || "dynamic",
179
+ ttlHours: claim.spec?.ttlHours,
180
+ createdAt: claim.metadata?.creationTimestamp,
181
+ linearIssue: claim.metadata?.labels?.["calltelemetry.com/linear-issue"] || null
182
+ }));
183
+ return {
184
+ content: [
185
+ {
186
+ type: "text",
187
+ text: JSON.stringify({
188
+ success: true,
189
+ namespace,
190
+ total: items.length,
191
+ claims: summary
192
+ }, null, 2)
193
+ }
194
+ ]
195
+ };
196
+ }
197
+ catch (err) {
198
+ logger.error(`Failed to list appliance claims: ${err.message}`);
199
+ return createToolErrorResult(ProxmoxErrorCode.UPSTREAM_API_ERROR, `Failed to list appliance claims in namespace '${namespace}': ${err.message}`);
200
+ }
201
+ }
202
+ export async function handleGetApplianceClaim(args, _context) {
203
+ const parsed = GetApplianceClaimInputSchema.safeParse(args);
204
+ if (!parsed.success) {
205
+ const issues = parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
206
+ return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, issues);
207
+ }
208
+ const { name, namespace } = parsed.data;
209
+ try {
210
+ let claim = null;
211
+ const apiPath = `/apis/calltelemetry.com/v1alpha1/namespaces/${namespace}/applianceclaims/${name}`;
212
+ let apiRes = null;
213
+ let apiError = null;
214
+ try {
215
+ apiRes = await queryKubernetesApi(apiPath);
216
+ }
217
+ catch (err) {
218
+ apiError = err.message;
219
+ logger.warn(`In-cluster Kubernetes API call to '${apiPath}' failed: ${err.message}`);
220
+ }
221
+ if (apiRes && apiRes.metadata) {
222
+ claim = apiRes;
223
+ }
224
+ else {
225
+ try {
226
+ const { stdout } = await execFileAsync("kubectl", [
227
+ "get",
228
+ "applianceclaim",
229
+ name,
230
+ "-n",
231
+ namespace,
232
+ "-o",
233
+ "json"
234
+ ]);
235
+ claim = JSON.parse(stdout);
236
+ }
237
+ catch (kubectlErr) {
238
+ if (apiError) {
239
+ throw new Error(`In-cluster Kubernetes API error: ${apiError}. Kubectl fallback error: ${kubectlErr.message}`);
240
+ }
241
+ throw kubectlErr;
242
+ }
243
+ }
244
+ return {
245
+ content: [
246
+ {
247
+ type: "text",
248
+ text: JSON.stringify({
249
+ success: true,
250
+ claim
251
+ }, null, 2)
252
+ }
253
+ ]
254
+ };
255
+ }
256
+ catch (err) {
257
+ return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, `ApplianceClaim '${name}' not found in namespace '${namespace}': ${err.message}`);
258
+ }
259
+ }
260
+ export async function handleCreateApplianceClaim(args, _context) {
261
+ const parsed = CreateApplianceClaimInputSchema.safeParse(args);
262
+ if (!parsed.success) {
263
+ const issues = parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
264
+ return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, issues);
265
+ }
266
+ const { namespace, targetIp, vmid, node, version, preset, ttlHours, licenseTier, licenseDays, adminEmail, linearIssue, containerOverrides, dryRun } = parsed.data;
267
+ let train;
268
+ try {
269
+ train = resolveAndValidateChannel(version, parsed.data.train);
270
+ }
271
+ catch (valErr) {
272
+ return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, valErr.message);
273
+ }
274
+ const claimName = parsed.data.name || (linearIssue
275
+ ? `claim-${linearIssue.toLowerCase().replace(/[^a-z0-9-]/g, "")}-${vmid || Math.floor(Math.random() * 900 + 100)}`
276
+ : `claim-appliance-${Math.floor(Date.now() / 1000)}`);
277
+ const manifest = {
278
+ apiVersion: "calltelemetry.com/v1alpha1",
279
+ kind: "ApplianceClaim",
280
+ metadata: {
281
+ name: claimName,
282
+ namespace,
283
+ labels: {
284
+ "app.kubernetes.io/managed-by": "ct-lab-mcp",
285
+ ...(linearIssue ? { "calltelemetry.com/linear-issue": linearIssue } : {})
286
+ }
287
+ },
288
+ spec: {
289
+ targetIp,
290
+ node,
291
+ version,
292
+ train,
293
+ preset,
294
+ ttlHours,
295
+ licenseTier,
296
+ licenseDays,
297
+ adminEmail,
298
+ ...(vmid ? { vmid } : {}),
299
+ ...(containerOverrides && Object.keys(containerOverrides).length > 0 ? { containerOverrides } : {})
300
+ }
301
+ };
302
+ if (dryRun) {
303
+ return {
304
+ content: [
305
+ {
306
+ type: "text",
307
+ text: JSON.stringify({
308
+ success: true,
309
+ dryRun: true,
310
+ status: "validated",
311
+ claimName,
312
+ manifest
313
+ }, null, 2)
314
+ }
315
+ ]
316
+ };
317
+ }
318
+ try {
319
+ const apiPath = `/apis/calltelemetry.com/v1alpha1/namespaces/${namespace}/applianceclaims`;
320
+ let apiRes = null;
321
+ let apiError = null;
322
+ try {
323
+ apiRes = await queryKubernetesApi(apiPath, {
324
+ method: "POST",
325
+ body: manifest
326
+ });
327
+ }
328
+ catch (err) {
329
+ apiError = err.message;
330
+ logger.warn(`In-cluster Kubernetes API call to '${apiPath}' failed: ${err.message}`);
331
+ }
332
+ let createdClaim = apiRes;
333
+ if (!createdClaim) {
334
+ try {
335
+ const { stdout } = await new Promise((resolve, reject) => {
336
+ const proc = execFile("kubectl", ["apply", "-f", "-"], (err, stdout, stderr) => {
337
+ if (err)
338
+ return reject(new Error(stderr || err.message));
339
+ resolve({ stdout, stderr });
340
+ });
341
+ proc.stdin?.write(JSON.stringify(manifest));
342
+ proc.stdin?.end();
343
+ });
344
+ createdClaim = { output: stdout.trim(), name: claimName };
345
+ }
346
+ catch (kubectlErr) {
347
+ if (apiError) {
348
+ throw new Error(`In-cluster Kubernetes API error: ${apiError}. Kubectl fallback error: ${kubectlErr.message}`);
349
+ }
350
+ throw kubectlErr;
351
+ }
352
+ }
353
+ return {
354
+ content: [
355
+ {
356
+ type: "text",
357
+ text: JSON.stringify({
358
+ success: true,
359
+ message: `ApplianceClaim '${claimName}' created in namespace '${namespace}'`,
360
+ claimName,
361
+ targetIp,
362
+ train,
363
+ version,
364
+ manifest
365
+ }, null, 2)
366
+ }
367
+ ]
368
+ };
369
+ }
370
+ catch (err) {
371
+ logger.error(`Failed to create ApplianceClaim '${claimName}': ${err.message}`);
372
+ return createToolErrorResult(ProxmoxErrorCode.UPSTREAM_API_ERROR, `Failed to create ApplianceClaim '${claimName}': ${err.message}`);
373
+ }
374
+ }
375
+ export async function handleDeleteApplianceClaim(args, _context) {
376
+ const parsed = DeleteApplianceClaimInputSchema.safeParse(args);
377
+ if (!parsed.success) {
378
+ const issues = parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
379
+ return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, issues);
380
+ }
381
+ const { name, namespace } = parsed.data;
382
+ try {
383
+ const apiPath = `/apis/calltelemetry.com/v1alpha1/namespaces/${namespace}/applianceclaims/${name}`;
384
+ let apiRes = null;
385
+ let apiError = null;
386
+ try {
387
+ apiRes = await queryKubernetesApi(apiPath, { method: "DELETE" });
388
+ }
389
+ catch (err) {
390
+ apiError = err.message;
391
+ logger.warn(`In-cluster Kubernetes API call to '${apiPath}' failed: ${err.message}`);
392
+ }
393
+ if (!apiRes) {
394
+ try {
395
+ await execFileAsync("kubectl", [
396
+ "delete",
397
+ "applianceclaim",
398
+ name,
399
+ "-n",
400
+ namespace,
401
+ "--ignore-not-found=true"
402
+ ]);
403
+ }
404
+ catch (kubectlErr) {
405
+ if (apiError) {
406
+ throw new Error(`In-cluster Kubernetes API error: ${apiError}. Kubectl fallback error: ${kubectlErr.message}`);
407
+ }
408
+ throw kubectlErr;
409
+ }
410
+ }
411
+ return {
412
+ content: [
413
+ {
414
+ type: "text",
415
+ text: JSON.stringify({
416
+ success: true,
417
+ message: `ApplianceClaim '${name}' deleted in namespace '${namespace}'. Operator teardown initiated.`
418
+ }, null, 2)
419
+ }
420
+ ]
421
+ };
422
+ }
423
+ catch (err) {
424
+ logger.error(`Failed to delete ApplianceClaim '${name}': ${err.message}`);
425
+ return createToolErrorResult(ProxmoxErrorCode.UPSTREAM_API_ERROR, `Failed to delete ApplianceClaim '${name}': ${err.message}`);
426
+ }
427
+ }
428
+ //# sourceMappingURL=appliance-claim-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appliance-claim-tools.js","sourceRoot":"","sources":["../../../src/tools/appliance-claim-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Appliance ID Discovery & Standardized Licensing Helper
3
+ *
4
+ * Implements hardware UUID derivation for CallTelemetry 0.8.7+ standardized appliance licensing.
5
+ * Matches the canonical pattern: CT-APP-XXXX-XXXX-XXXX
6
+ */
7
+ import { z } from "zod";
8
+ import { ToolContext } from "./list-hosts.js";
9
+ import { CallToolResult } from "../types/mcp.js";
10
+ export declare const APPLIANCE_ID_REGEX: RegExp;
11
+ export declare function formatApplianceIdFromUuid(rawUuid: string): string;
12
+ export declare function isValidApplianceId(applianceId: string): boolean;
13
+ export declare const GetApplianceIdInputShape: {
14
+ targetIp: z.ZodString;
15
+ port: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
16
+ timeoutMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
17
+ };
18
+ export declare const GetApplianceIdInputSchema: z.ZodObject<{
19
+ targetIp: z.ZodString;
20
+ port: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
21
+ timeoutMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
22
+ }, "strip", z.ZodTypeAny, {
23
+ targetIp: string;
24
+ port: number;
25
+ timeoutMs: number;
26
+ }, {
27
+ targetIp: string;
28
+ port?: number | undefined;
29
+ timeoutMs?: number | undefined;
30
+ }>;
31
+ export type GetApplianceIdInput = z.infer<typeof GetApplianceIdInputSchema>;
32
+ export declare function handleGetApplianceId(args: unknown, context: ToolContext): Promise<CallToolResult>;
33
+ //# sourceMappingURL=appliance-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appliance-id.d.ts","sourceRoot":"","sources":["../../../src/tools/appliance-id.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAA2C,MAAM,iBAAiB,CAAC;AAI1F,eAAO,MAAM,kBAAkB,QAAiD,CAAC;AAEjF,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOjE;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,eAAO,MAAM,wBAAwB;;;;CAqBpC,CAAC;AAEF,eAAO,MAAM,yBAAyB;;;;;;;;;;;;EAAqC,CAAC;AAC5E,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAoDzB"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Appliance ID Discovery & Standardized Licensing Helper
3
+ *
4
+ * Implements hardware UUID derivation for CallTelemetry 0.8.7+ standardized appliance licensing.
5
+ * Matches the canonical pattern: CT-APP-XXXX-XXXX-XXXX
6
+ */
7
+ import { z } from "zod";
8
+ import * as crypto from "node:crypto";
9
+ import { ProxmoxErrorCode, createToolErrorResult } from "../types/mcp.js";
10
+ import { applianceSshExecutor } from "../appliance/executor.js";
11
+ import { logger } from "../utils/logger.js";
12
+ export const APPLIANCE_ID_REGEX = /^CT-APP-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}$/;
13
+ export function formatApplianceIdFromUuid(rawUuid) {
14
+ const normalized = rawUuid.trim().toLowerCase().replace(/[^a-z0-9]/g, "");
15
+ if (!normalized) {
16
+ throw new Error("Cannot format Appliance ID from empty hardware UUID.");
17
+ }
18
+ const hash = crypto.createHash("sha256").update(normalized).digest("hex").toUpperCase();
19
+ return `CT-APP-${hash.substring(0, 4)}-${hash.substring(4, 8)}-${hash.substring(8, 12)}`;
20
+ }
21
+ export function isValidApplianceId(applianceId) {
22
+ return APPLIANCE_ID_REGEX.test(applianceId);
23
+ }
24
+ export const GetApplianceIdInputShape = {
25
+ targetIp: z
26
+ .string()
27
+ .min(1)
28
+ .describe("Target IP address or hostname of the Call Telemetry appliance (e.g. '192.168.124.221')."),
29
+ port: z
30
+ .number()
31
+ .int()
32
+ .min(1)
33
+ .max(65535)
34
+ .optional()
35
+ .default(2222)
36
+ .describe("SSH port (default: 2222)."),
37
+ timeoutMs: z
38
+ .number()
39
+ .int()
40
+ .min(2000)
41
+ .max(60000)
42
+ .optional()
43
+ .default(15000)
44
+ .describe("Execution timeout in milliseconds (default: 15000).")
45
+ };
46
+ export const GetApplianceIdInputSchema = z.object(GetApplianceIdInputShape);
47
+ export async function handleGetApplianceId(args, context) {
48
+ const parsed = GetApplianceIdInputSchema.safeParse(args);
49
+ if (!parsed.success) {
50
+ const issues = parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
51
+ return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, issues);
52
+ }
53
+ const { targetIp, port, timeoutMs } = parsed.data;
54
+ const executor = context.applianceExecutor || applianceSshExecutor;
55
+ logger.info(`Discovering hardware UUID on ${targetIp}:${port}...`);
56
+ try {
57
+ const res = await executor.execute({
58
+ targetIp,
59
+ port,
60
+ action: "get_hardware_uuid",
61
+ timeoutMs
62
+ });
63
+ const rawUuid = res.stdout.trim().split("\n")[0] || "";
64
+ if (!rawUuid || rawUuid === "00000000-0000-0000-0000-000000000000") {
65
+ throw new Error(`Invalid hardware UUID received from host: '${rawUuid}'`);
66
+ }
67
+ const applianceId = formatApplianceIdFromUuid(rawUuid);
68
+ return {
69
+ content: [
70
+ {
71
+ type: "text",
72
+ text: JSON.stringify({
73
+ success: true,
74
+ targetIp,
75
+ rawHardwareUuid: rawUuid,
76
+ applianceId,
77
+ standard: "calltelemetry-license-v2"
78
+ }, null, 2)
79
+ }
80
+ ]
81
+ };
82
+ }
83
+ catch (err) {
84
+ logger.error(`Failed to resolve appliance ID on ${targetIp}: ${err.message}`);
85
+ return createToolErrorResult(ProxmoxErrorCode.APPLIANCE_EXECUTION_FAILED, `Failed to resolve appliance ID on ${targetIp}: ${err.message}`);
86
+ }
87
+ }
88
+ //# sourceMappingURL=appliance-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appliance-id.js","sourceRoot":"","sources":["../../../src/tools/appliance-id.ts"],"names":[],"mappings":"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"}
@@ -53,5 +53,9 @@ export * from "./appliance-candidate-retire.js";
53
53
  export * from "./host-migrate-vm.js";
54
54
  export * from "./sandbox-tools.js";
55
55
  export * from "./fleet-metrics.js";
56
+ export * from "./appliance-claim-tools.js";
57
+ export * from "./sideload-runner.js";
58
+ export * from "./appliance-id.js";
59
+ export * from "./verify-demo.js";
56
60
  export declare function registerAllTools(mcpServer: McpServer, context: ToolContext): void;
57
61
  //# 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;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"}
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;AA4RzB,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;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AAYjC,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAm1BjF"}