@calltelemetry/ct-lab-mcp 0.8.69 → 0.8.70

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 (49) hide show
  1. package/README.md +5 -1
  2. package/dist/src/appliance/executor.d.ts.map +1 -1
  3. package/dist/src/appliance/executor.js +3 -172
  4. package/dist/src/appliance/executor.js.map +1 -1
  5. package/dist/src/hypervisors/esxi/client.d.ts.map +1 -1
  6. package/dist/src/hypervisors/esxi/client.js +5 -0
  7. package/dist/src/hypervisors/esxi/client.js.map +1 -1
  8. package/dist/src/proxmox/client.d.ts.map +1 -1
  9. package/dist/src/proxmox/client.js +17 -0
  10. package/dist/src/proxmox/client.js.map +1 -1
  11. package/dist/src/slot/purge-controller.d.ts +1 -0
  12. package/dist/src/slot/purge-controller.d.ts.map +1 -1
  13. package/dist/src/slot/purge-controller.js +4 -33
  14. package/dist/src/slot/purge-controller.js.map +1 -1
  15. package/dist/src/tools/appliance-claim-tools.d.ts +11 -7
  16. package/dist/src/tools/appliance-claim-tools.d.ts.map +1 -1
  17. package/dist/src/tools/appliance-claim-tools.js +28 -81
  18. package/dist/src/tools/appliance-claim-tools.js.map +1 -1
  19. package/dist/src/tools/appliance-exec.d.ts +4 -4
  20. package/dist/src/tools/claim-creation-projection.d.ts +7 -0
  21. package/dist/src/tools/claim-creation-projection.d.ts.map +1 -0
  22. package/dist/src/tools/claim-creation-projection.js +112 -0
  23. package/dist/src/tools/claim-creation-projection.js.map +1 -0
  24. package/dist/src/tools/claim-first.d.ts.map +1 -1
  25. package/dist/src/tools/claim-first.js +19 -15
  26. package/dist/src/tools/claim-first.js.map +1 -1
  27. package/dist/src/tools/claimed-import-qcow.d.ts +2 -2
  28. package/dist/src/tools/import-qcow.d.ts +6 -6
  29. package/dist/src/tools/index.d.ts.map +1 -1
  30. package/dist/src/tools/index.js +5 -1
  31. package/dist/src/tools/index.js.map +1 -1
  32. package/dist/src/tools/legacy-guest-guard.d.ts +4 -0
  33. package/dist/src/tools/legacy-guest-guard.d.ts.map +1 -0
  34. package/dist/src/tools/legacy-guest-guard.js +26 -0
  35. package/dist/src/tools/legacy-guest-guard.js.map +1 -0
  36. package/dist/src/tools/license-tools.d.ts +2 -2
  37. package/dist/src/tools/physical-slot-claim-spec-schema.v1.json +1 -0
  38. package/dist/src/tools/physical-slot.d.ts +205 -0
  39. package/dist/src/tools/physical-slot.d.ts.map +1 -0
  40. package/dist/src/tools/physical-slot.js +295 -0
  41. package/dist/src/tools/physical-slot.js.map +1 -0
  42. package/dist/src/tools/provision-tools.d.ts +16 -16
  43. package/dist/src/tools/sandbox-tools.d.ts +2 -2
  44. package/dist/src/tools/slot-kubernetes.d.ts +13 -0
  45. package/dist/src/tools/slot-kubernetes.d.ts.map +1 -0
  46. package/dist/src/tools/slot-kubernetes.js +108 -0
  47. package/dist/src/tools/slot-kubernetes.js.map +1 -0
  48. package/dist/src/tools/vm-action.d.ts +4 -4
  49. package/package.json +2 -2
@@ -0,0 +1,108 @@
1
+ /** Fixed namespace transport for physical-slot custody. Never retry an unknown write. */
2
+ import { execFile } from "node:child_process";
3
+ import * as fs from "node:fs";
4
+ import { userInfo } from "node:os";
5
+ import { join } from "node:path";
6
+ import { fetch, Agent } from "undici";
7
+ export class SlotApiError extends Error {
8
+ status;
9
+ constructor(status, message) {
10
+ super(message);
11
+ this.status = status;
12
+ }
13
+ }
14
+ const TOKEN = "/var/run/secrets/kubernetes.io/serviceaccount/token";
15
+ const CA = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt";
16
+ export const SLOT_CONTEXT = "do-nyc1-cluster-ny1";
17
+ export const SLOT_SERVER = "https://28a6e4a4-fbff-4b51-a9bd-6073ffd8cdb2.k8s.ondigitalocean.com";
18
+ const MAX_BYTES = 1_048_576;
19
+ const COLLECTIONS = ["/apis/coordination.k8s.io/v1/namespaces/ct-lab/leases", "/apis/calltelemetry.com/v1alpha1/namespaces/ct-lab/applianceclaims"];
20
+ export function assertSlotPath(path, method) {
21
+ const cleanPath = path.split("?")[0];
22
+ if (path !== cleanPath && !/^\?limit=500(?:&continue=[A-Za-z0-9%._~-]+)?$/.test(path.slice(cleanPath.length)))
23
+ throw new Error("physical slot query refused");
24
+ const collection = COLLECTIONS.find(p => cleanPath === p || cleanPath.startsWith(p + "/"));
25
+ if (!collection)
26
+ throw new Error("physical slot API path refused");
27
+ const name = cleanPath.slice(collection.length + 1);
28
+ if (cleanPath !== collection && (name.length > 253 || !name.split(".").every(label => /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(label))))
29
+ throw new Error("physical slot object name refused");
30
+ if (method === "POST" && cleanPath !== collection || method !== "POST" && cleanPath === collection && !(method === "GET" && collection === COLLECTIONS[1]))
31
+ throw new Error("physical slot method refused");
32
+ if (collection === COLLECTIONS[0] && method === "DELETE")
33
+ throw new Error("MCP cannot release a durable physical reservation");
34
+ if (collection === COLLECTIONS[1] && method === "PUT")
35
+ throw new Error("physical slot adapter cannot replace a claim");
36
+ }
37
+ function parse(text) {
38
+ if (Buffer.byteLength(text) > MAX_BYTES)
39
+ throw new Error("physical slot response exceeds bound");
40
+ const value = JSON.parse(text);
41
+ if (!value || typeof value !== "object" || Array.isArray(value))
42
+ throw new Error("physical slot response is not an object");
43
+ return value;
44
+ }
45
+ function kubectl(args, body, env) {
46
+ return new Promise((resolve, reject) => {
47
+ const child = execFile("kubectl", args, { env, timeout: 10_000, maxBuffer: MAX_BYTES }, (err, stdout, stderr) => {
48
+ if (err) {
49
+ // kubectl has no machine-readable HTTP code. Only exact NotFound is absence.
50
+ const status = /\(NotFound\)/.test(stderr) ? 404 : /\(AlreadyExists\)|\(Conflict\)/.test(stderr) ? 409 : null;
51
+ reject(new SlotApiError(status, `physical slot Kubernetes request failed (${status ?? "unknown"}); retain custody`));
52
+ }
53
+ else
54
+ resolve(stdout);
55
+ });
56
+ if (body !== undefined)
57
+ child.stdin?.end(JSON.stringify(body));
58
+ });
59
+ }
60
+ export function createSlotApi() {
61
+ // The selected transport cannot change after a timeout or failed mutation.
62
+ const inCluster = fs.existsSync(TOKEN);
63
+ let localReady;
64
+ const env = { ...process.env };
65
+ for (const key of ["KUBECONFIG", "KUBERNETES_MASTER", "KUBECTL_KUBERC", "HTTP_PROXY", "HTTPS_PROXY", "ALL_PROXY", "http_proxy", "https_proxy", "all_proxy"])
66
+ delete env[key];
67
+ env.KUBECTL_KUBERC = "false";
68
+ const base = ["--kubeconfig", join(userInfo().homedir, ".kube", "config"), "--context", SLOT_CONTEXT, "--server", SLOT_SERVER, "--insecure-skip-tls-verify=false", "--request-timeout=10s"];
69
+ return { async request(path, method, body) {
70
+ assertSlotPath(path, method);
71
+ if (inCluster) {
72
+ if (!fs.existsSync(CA))
73
+ throw new Error("physical slot Kubernetes CA unavailable");
74
+ const host = process.env.KUBERNETES_SERVICE_HOST || "kubernetes.default.svc";
75
+ const port = process.env.KUBERNETES_SERVICE_PORT || "443";
76
+ if (!/^[a-zA-Z0-9.-]+$/.test(host) || !/^\d{1,5}$/.test(port))
77
+ throw new Error("physical slot Kubernetes service identity refused");
78
+ const agent = new Agent({ connect: { ca: fs.readFileSync(CA), rejectUnauthorized: true } });
79
+ try {
80
+ const response = await fetch(`https://${host}:${port}${path}`, { method, headers: { Authorization: `Bearer ${fs.readFileSync(TOKEN, "utf8").trim()}`, "Content-Type": "application/json" }, body: body === undefined ? undefined : JSON.stringify(body), dispatcher: agent, signal: AbortSignal.timeout(10_000) });
81
+ if (response.status === 404 && method === "GET")
82
+ return null;
83
+ if (!response.ok)
84
+ throw new SlotApiError(response.status, `physical slot Kubernetes request failed (${response.status}); retain custody`);
85
+ return parse(await response.text());
86
+ }
87
+ finally {
88
+ await agent.close();
89
+ }
90
+ }
91
+ localReady ??= (async () => {
92
+ const cluster = parse(await kubectl([...base, "config", "view", "--minify", "--raw", "-o", "jsonpath={.clusters[0].cluster}"], undefined, env));
93
+ if (cluster.server !== SLOT_SERVER || cluster["insecure-skip-tls-verify"] === true || !(cluster["certificate-authority-data"] || cluster["certificate-authority"]) || cluster["proxy-url"] || cluster["tls-server-name"] && cluster["tls-server-name"] !== new URL(SLOT_SERVER).hostname)
94
+ throw new Error("physical slot fixed cluster TLS binding refused");
95
+ })();
96
+ await localReady;
97
+ const command = method === "GET" ? "get" : method === "POST" ? "create" : method === "PUT" ? "replace" : "delete";
98
+ try {
99
+ return parse(await kubectl([...base, command, "--raw", path, ...(body === undefined ? [] : ["-f", "-"])], body, env));
100
+ }
101
+ catch (err) {
102
+ if (method === "GET" && err instanceof SlotApiError && err.status === 404)
103
+ return null;
104
+ throw err;
105
+ }
106
+ } };
107
+ }
108
+ //# sourceMappingURL=slot-kubernetes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slot-kubernetes.js","sourceRoot":"","sources":["../../../src/tools/slot-kubernetes.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAItC,MAAM,OAAO,YAAa,SAAQ,KAAK;IACT;IAA5B,YAA4B,MAAqB,EAAE,OAAe;QAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAAzD,WAAM,GAAN,MAAM,CAAe;IAAqC,CAAC;CACxF;AACD,MAAM,KAAK,GAAG,qDAAqD,CAAC;AACpE,MAAM,EAAE,GAAG,sDAAsD,CAAC;AAClE,MAAM,CAAC,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAClD,MAAM,CAAC,MAAM,WAAW,GAAG,qEAAqE,CAAC;AACjG,MAAM,SAAS,GAAG,SAAS,CAAC;AAC5B,MAAM,WAAW,GAAG,CAAC,uDAAuD,EAAE,oEAAoE,CAAC,CAAC;AACpJ,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,MAAkB;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,+CAA+C,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC9J,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC3F,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpD,IAAI,SAAS,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,wCAAwC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACnM,IAAI,MAAM,KAAK,MAAM,IAAI,SAAS,KAAK,UAAU,IAAI,MAAM,KAAK,MAAM,IAAI,SAAS,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,IAAI,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC5M,IAAI,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,MAAM,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAC/H,IAAI,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,MAAM,KAAK,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;AACzH,CAAC;AACD,SAAS,KAAK,CAAC,IAAY;IACzB,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACjG,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC5H,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,OAAO,CAAC,IAAc,EAAE,IAAa,EAAE,GAAsB;IACpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YAC9G,IAAI,GAAG,EAAE,CAAC;gBACR,6EAA6E;gBAC7E,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,gCAAgC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC9G,MAAM,CAAC,IAAI,YAAY,CAAC,MAAM,EAAE,4CAA4C,MAAM,IAAI,SAAS,mBAAmB,CAAC,CAAC,CAAC;YACvH,CAAC;;gBAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,IAAI,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC;AACD,MAAM,UAAU,aAAa;IAC3B,2EAA2E;IAC3E,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,UAAqC,CAAC;IAC1C,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7K,GAAG,CAAC,cAAc,GAAG,OAAO,CAAC;IAC7B,MAAM,IAAI,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,kCAAkC,EAAE,uBAAuB,CAAC,CAAC;IAC5L,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI;YACvC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC7B,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBACnF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,wBAAwB,CAAC;gBAC7E,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,KAAK,CAAC;gBAC1D,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBACpI,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC5F,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACnT,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK;wBAAE,OAAO,IAAI,CAAC;oBAC7D,IAAI,CAAC,QAAQ,CAAC,EAAE;wBAAE,MAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAE,4CAA4C,QAAQ,CAAC,MAAM,mBAAmB,CAAC,CAAC;oBAC1I,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;gBACtC,CAAC;wBAAS,CAAC;oBAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;gBAAC,CAAC;YACpC,CAAC;YACD,UAAU,KAAK,CAAC,KAAK,IAAI,EAAE;gBACzB,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,iCAAiC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;gBAChJ,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,CAAC,0BAA0B,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,iBAAiB,CAAC,IAAI,OAAO,CAAC,iBAAiB,CAAC,KAAK,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,QAAQ;oBAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YAC/V,CAAC,CAAC,EAAE,CAAC;YACL,MAAM,UAAU,CAAC;YACjB,MAAM,OAAO,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;YAClH,IAAI,CAAC;gBAAC,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YAAC,CAAC;YAC9H,OAAO,GAAG,EAAE,CAAC;gBAAC,IAAI,MAAM,KAAK,KAAK,IAAI,GAAG,YAAY,YAAY,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;oBAAE,OAAO,IAAI,CAAC;gBAAC,MAAM,GAAG,CAAC;YAAC,CAAC;QACpH,CAAC,EAAE,CAAC;AACN,CAAC"}
@@ -137,8 +137,8 @@ export declare const VmActionInputSchema: z.ZodEffects<z.ZodObject<{
137
137
  vmid?: string | number | undefined;
138
138
  reason?: string | undefined;
139
139
  timeoutSeconds?: number | undefined;
140
- assetId?: string | undefined;
141
140
  hostAssetId?: string | undefined;
141
+ assetId?: string | undefined;
142
142
  artifactReceipt?: string | undefined;
143
143
  receiptFile?: string | undefined;
144
144
  confirmAssetId?: string | undefined;
@@ -168,8 +168,8 @@ export declare const VmActionInputSchema: z.ZodEffects<z.ZodObject<{
168
168
  format?: "table" | "json" | undefined;
169
169
  reason?: string | undefined;
170
170
  timeoutSeconds?: number | undefined;
171
- assetId?: string | undefined;
172
171
  hostAssetId?: string | undefined;
172
+ assetId?: string | undefined;
173
173
  artifactReceipt?: string | undefined;
174
174
  apply?: boolean | undefined;
175
175
  receiptFile?: string | undefined;
@@ -207,8 +207,8 @@ export declare const VmActionInputSchema: z.ZodEffects<z.ZodObject<{
207
207
  vmid?: string | number | undefined;
208
208
  reason?: string | undefined;
209
209
  timeoutSeconds?: number | undefined;
210
- assetId?: string | undefined;
211
210
  hostAssetId?: string | undefined;
211
+ assetId?: string | undefined;
212
212
  artifactReceipt?: string | undefined;
213
213
  receiptFile?: string | undefined;
214
214
  confirmAssetId?: string | undefined;
@@ -238,8 +238,8 @@ export declare const VmActionInputSchema: z.ZodEffects<z.ZodObject<{
238
238
  format?: "table" | "json" | undefined;
239
239
  reason?: string | undefined;
240
240
  timeoutSeconds?: number | undefined;
241
- assetId?: string | undefined;
242
241
  hostAssetId?: string | undefined;
242
+ assetId?: string | undefined;
243
243
  artifactReceipt?: string | undefined;
244
244
  apply?: boolean | undefined;
245
245
  receiptFile?: string | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@calltelemetry/ct-lab-mcp",
3
- "version": "0.8.69",
3
+ "version": "0.8.70",
4
4
  "description": "Expanded Model Context Protocol (MCP) server for Call Telemetry lab, fleet, and appliance management across Proxmox VE and VMware ESXi.",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -15,7 +15,7 @@
15
15
  "LICENSE"
16
16
  ],
17
17
  "scripts": {
18
- "build": "tsc -p tsconfig.build.json && chmod +x dist/bin/*.js",
18
+ "build": "tsc -p tsconfig.build.json && node tools/copy-physical-slot-schema.mjs && chmod +x dist/bin/*.js",
19
19
  "typecheck": "tsc --noEmit",
20
20
  "pretest": "npm run build",
21
21
  "test": "vitest run",