@calltelemetry/ct-lab-mcp 0.1.0

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 (231) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +309 -0
  3. package/dist/bin/ct-lab-mcp.d.ts +60 -0
  4. package/dist/bin/ct-lab-mcp.d.ts.map +1 -0
  5. package/dist/bin/ct-lab-mcp.js +261 -0
  6. package/dist/bin/ct-lab-mcp.js.map +1 -0
  7. package/dist/bin/proxmox-mcp.d.ts +58 -0
  8. package/dist/bin/proxmox-mcp.d.ts.map +1 -0
  9. package/dist/bin/proxmox-mcp.js +248 -0
  10. package/dist/bin/proxmox-mcp.js.map +1 -0
  11. package/dist/src/appliance/commands.d.ts +33 -0
  12. package/dist/src/appliance/commands.d.ts.map +1 -0
  13. package/dist/src/appliance/commands.js +241 -0
  14. package/dist/src/appliance/commands.js.map +1 -0
  15. package/dist/src/appliance/executor.d.ts +34 -0
  16. package/dist/src/appliance/executor.d.ts.map +1 -0
  17. package/dist/src/appliance/executor.js +214 -0
  18. package/dist/src/appliance/executor.js.map +1 -0
  19. package/dist/src/appliance/index.d.ts +8 -0
  20. package/dist/src/appliance/index.d.ts.map +1 -0
  21. package/dist/src/appliance/index.js +8 -0
  22. package/dist/src/appliance/index.js.map +1 -0
  23. package/dist/src/appliance/mock.d.ts +66 -0
  24. package/dist/src/appliance/mock.d.ts.map +1 -0
  25. package/dist/src/appliance/mock.js +339 -0
  26. package/dist/src/appliance/mock.js.map +1 -0
  27. package/dist/src/appliance/types.d.ts +83 -0
  28. package/dist/src/appliance/types.d.ts.map +1 -0
  29. package/dist/src/appliance/types.js +58 -0
  30. package/dist/src/appliance/types.js.map +1 -0
  31. package/dist/src/credentials/doppler.d.ts +25 -0
  32. package/dist/src/credentials/doppler.d.ts.map +1 -0
  33. package/dist/src/credentials/doppler.js +68 -0
  34. package/dist/src/credentials/doppler.js.map +1 -0
  35. package/dist/src/credentials/index.d.ts +4 -0
  36. package/dist/src/credentials/index.d.ts.map +1 -0
  37. package/dist/src/credentials/index.js +4 -0
  38. package/dist/src/credentials/index.js.map +1 -0
  39. package/dist/src/credentials/resolver.d.ts +36 -0
  40. package/dist/src/credentials/resolver.d.ts.map +1 -0
  41. package/dist/src/credentials/resolver.js +427 -0
  42. package/dist/src/credentials/resolver.js.map +1 -0
  43. package/dist/src/credentials/types.d.ts +73 -0
  44. package/dist/src/credentials/types.d.ts.map +1 -0
  45. package/dist/src/credentials/types.js +5 -0
  46. package/dist/src/credentials/types.js.map +1 -0
  47. package/dist/src/guardrails/index.d.ts +3 -0
  48. package/dist/src/guardrails/index.d.ts.map +1 -0
  49. package/dist/src/guardrails/index.js +3 -0
  50. package/dist/src/guardrails/index.js.map +1 -0
  51. package/dist/src/guardrails/safety.d.ts +45 -0
  52. package/dist/src/guardrails/safety.d.ts.map +1 -0
  53. package/dist/src/guardrails/safety.js +217 -0
  54. package/dist/src/guardrails/safety.js.map +1 -0
  55. package/dist/src/guardrails/types.d.ts +36 -0
  56. package/dist/src/guardrails/types.d.ts.map +1 -0
  57. package/dist/src/guardrails/types.js +20 -0
  58. package/dist/src/guardrails/types.js.map +1 -0
  59. package/dist/src/hypervisors/esxi/client.d.ts +103 -0
  60. package/dist/src/hypervisors/esxi/client.d.ts.map +1 -0
  61. package/dist/src/hypervisors/esxi/client.js +395 -0
  62. package/dist/src/hypervisors/esxi/client.js.map +1 -0
  63. package/dist/src/hypervisors/esxi/mock.d.ts +45 -0
  64. package/dist/src/hypervisors/esxi/mock.d.ts.map +1 -0
  65. package/dist/src/hypervisors/esxi/mock.js +202 -0
  66. package/dist/src/hypervisors/esxi/mock.js.map +1 -0
  67. package/dist/src/hypervisors/index.d.ts +10 -0
  68. package/dist/src/hypervisors/index.d.ts.map +1 -0
  69. package/dist/src/hypervisors/index.js +10 -0
  70. package/dist/src/hypervisors/index.js.map +1 -0
  71. package/dist/src/hypervisors/manager.d.ts +78 -0
  72. package/dist/src/hypervisors/manager.d.ts.map +1 -0
  73. package/dist/src/hypervisors/manager.js +415 -0
  74. package/dist/src/hypervisors/manager.js.map +1 -0
  75. package/dist/src/hypervisors/proxmox/client.d.ts +29 -0
  76. package/dist/src/hypervisors/proxmox/client.d.ts.map +1 -0
  77. package/dist/src/hypervisors/proxmox/client.js +278 -0
  78. package/dist/src/hypervisors/proxmox/client.js.map +1 -0
  79. package/dist/src/hypervisors/proxmox/mock.d.ts +17 -0
  80. package/dist/src/hypervisors/proxmox/mock.d.ts.map +1 -0
  81. package/dist/src/hypervisors/proxmox/mock.js +26 -0
  82. package/dist/src/hypervisors/proxmox/mock.js.map +1 -0
  83. package/dist/src/hypervisors/types.d.ts +159 -0
  84. package/dist/src/hypervisors/types.d.ts.map +1 -0
  85. package/dist/src/hypervisors/types.js +6 -0
  86. package/dist/src/hypervisors/types.js.map +1 -0
  87. package/dist/src/index.d.ts +19 -0
  88. package/dist/src/index.d.ts.map +1 -0
  89. package/dist/src/index.js +19 -0
  90. package/dist/src/index.js.map +1 -0
  91. package/dist/src/proxmox/client.d.ts +37 -0
  92. package/dist/src/proxmox/client.d.ts.map +1 -0
  93. package/dist/src/proxmox/client.js +282 -0
  94. package/dist/src/proxmox/client.js.map +1 -0
  95. package/dist/src/proxmox/index.d.ts +53 -0
  96. package/dist/src/proxmox/index.d.ts.map +1 -0
  97. package/dist/src/proxmox/index.js +109 -0
  98. package/dist/src/proxmox/index.js.map +1 -0
  99. package/dist/src/proxmox/mock.d.ts +40 -0
  100. package/dist/src/proxmox/mock.d.ts.map +1 -0
  101. package/dist/src/proxmox/mock.js +362 -0
  102. package/dist/src/proxmox/mock.js.map +1 -0
  103. package/dist/src/proxmox/poller.d.ts +29 -0
  104. package/dist/src/proxmox/poller.d.ts.map +1 -0
  105. package/dist/src/proxmox/poller.js +107 -0
  106. package/dist/src/proxmox/poller.js.map +1 -0
  107. package/dist/src/server/index.d.ts +2 -0
  108. package/dist/src/server/index.d.ts.map +1 -0
  109. package/dist/src/server/index.js +2 -0
  110. package/dist/src/server/index.js.map +1 -0
  111. package/dist/src/server/mcp-server.d.ts +5 -0
  112. package/dist/src/server/mcp-server.d.ts.map +1 -0
  113. package/dist/src/server/mcp-server.js +5 -0
  114. package/dist/src/server/mcp-server.js.map +1 -0
  115. package/dist/src/server.d.ts +35 -0
  116. package/dist/src/server.d.ts.map +1 -0
  117. package/dist/src/server.js +95 -0
  118. package/dist/src/server.js.map +1 -0
  119. package/dist/src/slot/gc.d.ts +42 -0
  120. package/dist/src/slot/gc.d.ts.map +1 -0
  121. package/dist/src/slot/gc.js +79 -0
  122. package/dist/src/slot/gc.js.map +1 -0
  123. package/dist/src/slot/index.d.ts +4 -0
  124. package/dist/src/slot/index.d.ts.map +1 -0
  125. package/dist/src/slot/index.js +4 -0
  126. package/dist/src/slot/index.js.map +1 -0
  127. package/dist/src/slot/manager.d.ts +92 -0
  128. package/dist/src/slot/manager.d.ts.map +1 -0
  129. package/dist/src/slot/manager.js +650 -0
  130. package/dist/src/slot/manager.js.map +1 -0
  131. package/dist/src/slot/types.d.ts +184 -0
  132. package/dist/src/slot/types.d.ts.map +1 -0
  133. package/dist/src/slot/types.js +67 -0
  134. package/dist/src/slot/types.js.map +1 -0
  135. package/dist/src/tools/appliance-exec.d.ts +81 -0
  136. package/dist/src/tools/appliance-exec.d.ts.map +1 -0
  137. package/dist/src/tools/appliance-exec.js +134 -0
  138. package/dist/src/tools/appliance-exec.js.map +1 -0
  139. package/dist/src/tools/claim-slot.d.ts +5 -0
  140. package/dist/src/tools/claim-slot.d.ts.map +1 -0
  141. package/dist/src/tools/claim-slot.js +5 -0
  142. package/dist/src/tools/claim-slot.js.map +1 -0
  143. package/dist/src/tools/index.d.ts +26 -0
  144. package/dist/src/tools/index.d.ts.map +1 -0
  145. package/dist/src/tools/index.js +63 -0
  146. package/dist/src/tools/index.js.map +1 -0
  147. package/dist/src/tools/list-hosts.d.ts +41 -0
  148. package/dist/src/tools/list-hosts.d.ts.map +1 -0
  149. package/dist/src/tools/list-hosts.js +91 -0
  150. package/dist/src/tools/list-hosts.js.map +1 -0
  151. package/dist/src/tools/list-inventory.d.ts +50 -0
  152. package/dist/src/tools/list-inventory.d.ts.map +1 -0
  153. package/dist/src/tools/list-inventory.js +112 -0
  154. package/dist/src/tools/list-inventory.js.map +1 -0
  155. package/dist/src/tools/list-slots.d.ts +5 -0
  156. package/dist/src/tools/list-slots.d.ts.map +1 -0
  157. package/dist/src/tools/list-slots.js +5 -0
  158. package/dist/src/tools/list-slots.js.map +1 -0
  159. package/dist/src/tools/provision-tools.d.ts +231 -0
  160. package/dist/src/tools/provision-tools.d.ts.map +1 -0
  161. package/dist/src/tools/provision-tools.js +289 -0
  162. package/dist/src/tools/provision-tools.js.map +1 -0
  163. package/dist/src/tools/release-slot.d.ts +5 -0
  164. package/dist/src/tools/release-slot.d.ts.map +1 -0
  165. package/dist/src/tools/release-slot.js +5 -0
  166. package/dist/src/tools/release-slot.js.map +1 -0
  167. package/dist/src/tools/slot-tools.d.ts +173 -0
  168. package/dist/src/tools/slot-tools.d.ts.map +1 -0
  169. package/dist/src/tools/slot-tools.js +296 -0
  170. package/dist/src/tools/slot-tools.js.map +1 -0
  171. package/dist/src/tools/vm-action.d.ts +189 -0
  172. package/dist/src/tools/vm-action.d.ts.map +1 -0
  173. package/dist/src/tools/vm-action.js +300 -0
  174. package/dist/src/tools/vm-action.js.map +1 -0
  175. package/dist/src/transports/index.d.ts +3 -0
  176. package/dist/src/transports/index.d.ts.map +1 -0
  177. package/dist/src/transports/index.js +3 -0
  178. package/dist/src/transports/index.js.map +1 -0
  179. package/dist/src/transports/sse.d.ts +38 -0
  180. package/dist/src/transports/sse.d.ts.map +1 -0
  181. package/dist/src/transports/sse.js +167 -0
  182. package/dist/src/transports/sse.js.map +1 -0
  183. package/dist/src/transports/stdio.d.ts +15 -0
  184. package/dist/src/transports/stdio.d.ts.map +1 -0
  185. package/dist/src/transports/stdio.js +34 -0
  186. package/dist/src/transports/stdio.js.map +1 -0
  187. package/dist/src/types/config.d.ts +17 -0
  188. package/dist/src/types/config.d.ts.map +1 -0
  189. package/dist/src/types/config.js +5 -0
  190. package/dist/src/types/config.js.map +1 -0
  191. package/dist/src/types/index.d.ts +4 -0
  192. package/dist/src/types/index.d.ts.map +1 -0
  193. package/dist/src/types/index.js +4 -0
  194. package/dist/src/types/index.js.map +1 -0
  195. package/dist/src/types/mcp.d.ts +38 -0
  196. package/dist/src/types/mcp.d.ts.map +1 -0
  197. package/dist/src/types/mcp.js +46 -0
  198. package/dist/src/types/mcp.js.map +1 -0
  199. package/dist/src/types/proxmox.d.ts +181 -0
  200. package/dist/src/types/proxmox.d.ts.map +1 -0
  201. package/dist/src/types/proxmox.js +5 -0
  202. package/dist/src/types/proxmox.js.map +1 -0
  203. package/dist/src/types/slot.d.ts +5 -0
  204. package/dist/src/types/slot.d.ts.map +1 -0
  205. package/dist/src/types/slot.js +5 -0
  206. package/dist/src/types/slot.js.map +1 -0
  207. package/dist/src/utils/formatters.d.ts +71 -0
  208. package/dist/src/utils/formatters.d.ts.map +1 -0
  209. package/dist/src/utils/formatters.js +480 -0
  210. package/dist/src/utils/formatters.js.map +1 -0
  211. package/dist/src/utils/index.d.ts +6 -0
  212. package/dist/src/utils/index.d.ts.map +1 -0
  213. package/dist/src/utils/index.js +6 -0
  214. package/dist/src/utils/index.js.map +1 -0
  215. package/dist/src/utils/logger.d.ts +28 -0
  216. package/dist/src/utils/logger.d.ts.map +1 -0
  217. package/dist/src/utils/logger.js +74 -0
  218. package/dist/src/utils/logger.js.map +1 -0
  219. package/dist/src/utils/mutex.d.ts +32 -0
  220. package/dist/src/utils/mutex.d.ts.map +1 -0
  221. package/dist/src/utils/mutex.js +86 -0
  222. package/dist/src/utils/mutex.js.map +1 -0
  223. package/dist/src/utils/redact.d.ts +6 -0
  224. package/dist/src/utils/redact.d.ts.map +1 -0
  225. package/dist/src/utils/redact.js +6 -0
  226. package/dist/src/utils/redact.js.map +1 -0
  227. package/dist/src/utils/redactor.d.ts +50 -0
  228. package/dist/src/utils/redactor.d.ts.map +1 -0
  229. package/dist/src/utils/redactor.js +170 -0
  230. package/dist/src/utils/redactor.js.map +1 -0
  231. package/package.json +75 -0
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Asynchronous Mutex for atomic operations and concurrency control.
3
+ * Protects shared state against race conditions during simultaneous requests.
4
+ */
5
+ export declare class AsyncMutex {
6
+ private queue;
7
+ private locked;
8
+ /**
9
+ * Acquires the mutex lock.
10
+ * Resolves with a release function once the lock is acquired.
11
+ * If timeoutMs is provided (> 0) and the lock cannot be acquired within that duration,
12
+ * the promise rejects with a timeout error.
13
+ */
14
+ acquire(timeoutMs?: number): Promise<() => void>;
15
+ /**
16
+ * Releases the mutex lock and passes control to the next queued task, if any.
17
+ */
18
+ private release;
19
+ /**
20
+ * Executes a task exclusively within the lock, ensuring release upon completion or failure.
21
+ */
22
+ runExclusive<T>(fn: () => Promise<T> | T, timeoutMs?: number): Promise<T>;
23
+ /**
24
+ * Whether the mutex is currently locked.
25
+ */
26
+ get isLocked(): boolean;
27
+ /**
28
+ * Current number of waiting tasks in queue.
29
+ */
30
+ get queueLength(): number;
31
+ }
32
+ //# sourceMappingURL=mutex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutex.d.ts","sourceRoot":"","sources":["../../../src/utils/mutex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,MAAM,CAAS;IAEvB;;;;;OAKG;IACG,OAAO,CAAC,SAAS,SAAO,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAmCpD;;OAEG;IACH,OAAO,CAAC,OAAO;IASf;;OAEG;IACG,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAS7E;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,CAExB;CACF"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Asynchronous Mutex for atomic operations and concurrency control.
3
+ * Protects shared state against race conditions during simultaneous requests.
4
+ */
5
+ export class AsyncMutex {
6
+ queue = [];
7
+ locked = false;
8
+ /**
9
+ * Acquires the mutex lock.
10
+ * Resolves with a release function once the lock is acquired.
11
+ * If timeoutMs is provided (> 0) and the lock cannot be acquired within that duration,
12
+ * the promise rejects with a timeout error.
13
+ */
14
+ async acquire(timeoutMs = 5000) {
15
+ return new Promise((resolve, reject) => {
16
+ let timer = null;
17
+ let settled = false;
18
+ const run = () => {
19
+ if (settled)
20
+ return;
21
+ settled = true;
22
+ if (timer) {
23
+ clearTimeout(timer);
24
+ timer = null;
25
+ }
26
+ this.locked = true;
27
+ resolve(() => this.release());
28
+ };
29
+ if (!this.locked) {
30
+ run();
31
+ }
32
+ else {
33
+ if (timeoutMs > 0) {
34
+ timer = setTimeout(() => {
35
+ if (settled)
36
+ return;
37
+ settled = true;
38
+ const idx = this.queue.indexOf(run);
39
+ if (idx !== -1) {
40
+ this.queue.splice(idx, 1);
41
+ }
42
+ reject(new Error(`AsyncMutex acquisition timed out after ${timeoutMs}ms`));
43
+ }, timeoutMs);
44
+ }
45
+ this.queue.push(run);
46
+ }
47
+ });
48
+ }
49
+ /**
50
+ * Releases the mutex lock and passes control to the next queued task, if any.
51
+ */
52
+ release() {
53
+ const next = this.queue.shift();
54
+ if (next) {
55
+ next();
56
+ }
57
+ else {
58
+ this.locked = false;
59
+ }
60
+ }
61
+ /**
62
+ * Executes a task exclusively within the lock, ensuring release upon completion or failure.
63
+ */
64
+ async runExclusive(fn, timeoutMs = 5000) {
65
+ const release = await this.acquire(timeoutMs);
66
+ try {
67
+ return await fn();
68
+ }
69
+ finally {
70
+ release();
71
+ }
72
+ }
73
+ /**
74
+ * Whether the mutex is currently locked.
75
+ */
76
+ get isLocked() {
77
+ return this.locked;
78
+ }
79
+ /**
80
+ * Current number of waiting tasks in queue.
81
+ */
82
+ get queueLength() {
83
+ return this.queue.length;
84
+ }
85
+ }
86
+ //# sourceMappingURL=mutex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutex.js","sourceRoot":"","sources":["../../../src/utils/mutex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,OAAO,UAAU;IACb,KAAK,GAAsB,EAAE,CAAC;IAC9B,MAAM,GAAG,KAAK,CAAC;IAEvB;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI;QAC5B,OAAO,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACjD,IAAI,KAAK,GAA0B,IAAI,CAAC;YACxC,IAAI,OAAO,GAAG,KAAK,CAAC;YAEpB,MAAM,GAAG,GAAG,GAAG,EAAE;gBACf,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,IAAI,KAAK,EAAE,CAAC;oBACV,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,KAAK,GAAG,IAAI,CAAC;gBACf,CAAC;gBACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAChC,CAAC,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,GAAG,EAAE,CAAC;YACR,CAAC;iBAAM,CAAC;gBACN,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;oBAClB,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;wBACtB,IAAI,OAAO;4BAAE,OAAO;wBACpB,OAAO,GAAG,IAAI,CAAC;wBACf,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;wBACpC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;4BACf,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;wBAC5B,CAAC;wBACD,MAAM,CAAC,IAAI,KAAK,CAAC,0CAA0C,SAAS,IAAI,CAAC,CAAC,CAAC;oBAC7E,CAAC,EAAE,SAAS,CAAC,CAAC;gBAChB,CAAC;gBACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,OAAO;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,EAAE,CAAC;QACT,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAI,EAAwB,EAAE,SAAS,GAAG,IAAI;QAC9D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Backward compatibility re-export module for redact and logger utils.
3
+ */
4
+ export { SecretRedactor, defaultRedactor, redactString, redactObject, registerSecret, registerSecrets } from "./redactor.js";
5
+ export { SafeLogger, logger } from "./logger.js";
6
+ //# sourceMappingURL=redact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../../src/utils/redact.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,cAAc,EACd,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,eAAe,EAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,UAAU,EACV,MAAM,EACP,MAAM,aAAa,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Backward compatibility re-export module for redact and logger utils.
3
+ */
4
+ export { SecretRedactor, defaultRedactor, redactString, redactObject, registerSecret, registerSecrets } from "./redactor.js";
5
+ export { SafeLogger, logger } from "./logger.js";
6
+ //# sourceMappingURL=redact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../../src/utils/redact.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,cAAc,EACd,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,eAAe,EAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,UAAU,EACV,MAAM,EACP,MAAM,aAAa,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Secret Redaction Engine
3
+ * Guarantees zero credential leakage in logs, error messages, MCP tool responses, and SSH streams.
4
+ */
5
+ export interface RedactionPattern {
6
+ name: string;
7
+ regex: RegExp;
8
+ replacement: string | ((match: string, ...args: unknown[]) => string);
9
+ }
10
+ export declare class SecretRedactor {
11
+ private static readonly DEFAULT_PATTERNS;
12
+ private patterns;
13
+ private registeredSecrets;
14
+ constructor(customPatterns?: RedactionPattern[]);
15
+ /**
16
+ * Register an explicit secret string to mask wherever it appears.
17
+ * Strings shorter than 4 characters are ignored to prevent aggressive over-redaction.
18
+ */
19
+ registerSecret(secret: string | undefined | null): void;
20
+ /**
21
+ * Register multiple secrets at once.
22
+ */
23
+ registerSecrets(secrets: (string | undefined | null)[]): void;
24
+ /**
25
+ * Clear all registered dynamic secrets.
26
+ */
27
+ clearRegisteredSecrets(): void;
28
+ /**
29
+ * Get the number of currently registered dynamic secrets.
30
+ */
31
+ getRegisteredSecretsCount(): number;
32
+ /**
33
+ * Mask all registered secrets and known secret patterns in a string.
34
+ */
35
+ redactString(input: string): string;
36
+ /**
37
+ * Recursively redact an object, array, Error, or primitive data structure.
38
+ */
39
+ redactObject<T>(obj: T): T;
40
+ /**
41
+ * Redact an Error instance's message and stack trace.
42
+ */
43
+ redactError(err: Error): Error;
44
+ }
45
+ export declare const defaultRedactor: SecretRedactor;
46
+ export declare function redactString(input: string): string;
47
+ export declare function redactObject<T>(obj: T): T;
48
+ export declare function registerSecret(secret: string | undefined | null): void;
49
+ export declare function registerSecrets(secrets: (string | undefined | null)[]): void;
50
+ //# sourceMappingURL=redactor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redactor.d.ts","sourceRoot":"","sources":["../../../src/utils/redactor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC,CAAC;CACvE;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CA8CtC;IAEF,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,iBAAiB,CAA0B;gBAEvC,cAAc,CAAC,EAAE,gBAAgB,EAAE;IAI/C;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI;IASvD;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI;IAM7D;;OAEG;IACH,sBAAsB,IAAI,IAAI;IAI9B;;OAEG;IACH,yBAAyB,IAAI,MAAM;IAInC;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IA2BnC;;OAEG;IACH,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;IAiC1B;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,KAAK,GAAG,KAAK;CAS/B;AAED,eAAO,MAAM,eAAe,gBAAuB,CAAC;AAEpD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAEzC;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,CAEtE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAE5E"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Secret Redaction Engine
3
+ * Guarantees zero credential leakage in logs, error messages, MCP tool responses, and SSH streams.
4
+ */
5
+ export class SecretRedactor {
6
+ static DEFAULT_PATTERNS = [
7
+ {
8
+ name: "ssh_private_key",
9
+ regex: /-----BEGIN (?:RSA |OPENSSH |EC |DSA )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |OPENSSH |EC |DSA )?PRIVATE KEY-----/g,
10
+ replacement: "[REDACTED_PRIVATE_KEY]"
11
+ },
12
+ {
13
+ name: "proxmox_api_token",
14
+ regex: /PVEAPIToken=[^;\s&"'\r\n]+/gi,
15
+ replacement: "PVEAPIToken=[REDACTED_API_TOKEN]"
16
+ },
17
+ {
18
+ name: "proxmox_auth_cookie",
19
+ regex: /PVEAuthCookie=[^;\s&"'\r\n]+/gi,
20
+ replacement: "PVEAuthCookie=[REDACTED_AUTH_COOKIE]"
21
+ },
22
+ {
23
+ name: "csrf_token",
24
+ regex: /CSRFPreventionToken=[^;\s&"'\r\n]+/gi,
25
+ replacement: "CSRFPreventionToken=[REDACTED_CSRF_TOKEN]"
26
+ },
27
+ {
28
+ name: "doppler_token",
29
+ regex: /dp\.(?:st|pt|ct|sa)\.[a-zA-Z0-9_\-\.]+/g,
30
+ replacement: "[REDACTED_DOPPLER_TOKEN]"
31
+ },
32
+ {
33
+ name: "bearer_token",
34
+ regex: /Bearer\s+([a-zA-Z0-9_\-\.]{10,})/gi,
35
+ replacement: "Bearer [REDACTED_TOKEN]"
36
+ },
37
+ {
38
+ name: "url_basic_auth",
39
+ regex: /(\b[a-zA-Z]{2,12}:\/\/[^\s:\/@]+:)([^@\s\/]+)(@)/g,
40
+ replacement: "$1[REDACTED]$3"
41
+ },
42
+ {
43
+ name: "uuid_secret",
44
+ regex: /[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}/g,
45
+ replacement: "[REDACTED_SECRET]"
46
+ },
47
+ {
48
+ name: "json_or_kv_secrets",
49
+ regex: /(["']?(?:password|token_secret|secret|token|ticket|CSRFPreventionToken|authCookie|private_key|privateKey|passphrase|govc_password)["']?\s*[:=]\s*["'])([^"']+)(["'])/gi,
50
+ replacement: (_match, p1, _p2, p3) => `${p1}[REDACTED]${p3}`
51
+ }
52
+ ];
53
+ patterns = [];
54
+ registeredSecrets = new Set();
55
+ constructor(customPatterns) {
56
+ this.patterns = [...SecretRedactor.DEFAULT_PATTERNS, ...(customPatterns || [])];
57
+ }
58
+ /**
59
+ * Register an explicit secret string to mask wherever it appears.
60
+ * Strings shorter than 4 characters are ignored to prevent aggressive over-redaction.
61
+ */
62
+ registerSecret(secret) {
63
+ if (secret && typeof secret === "string") {
64
+ const trimmed = secret.trim();
65
+ if (trimmed.length >= 4) {
66
+ this.registeredSecrets.add(trimmed);
67
+ }
68
+ }
69
+ }
70
+ /**
71
+ * Register multiple secrets at once.
72
+ */
73
+ registerSecrets(secrets) {
74
+ for (const secret of secrets) {
75
+ this.registerSecret(secret);
76
+ }
77
+ }
78
+ /**
79
+ * Clear all registered dynamic secrets.
80
+ */
81
+ clearRegisteredSecrets() {
82
+ this.registeredSecrets.clear();
83
+ }
84
+ /**
85
+ * Get the number of currently registered dynamic secrets.
86
+ */
87
+ getRegisteredSecretsCount() {
88
+ return this.registeredSecrets.size;
89
+ }
90
+ /**
91
+ * Mask all registered secrets and known secret patterns in a string.
92
+ */
93
+ redactString(input) {
94
+ if (!input || typeof input !== "string") {
95
+ return input;
96
+ }
97
+ let result = input;
98
+ // 1. Explicit registered secret literal substitution (longest first to avoid partial overlap)
99
+ const sortedSecrets = Array.from(this.registeredSecrets).sort((a, b) => b.length - a.length);
100
+ for (const secret of sortedSecrets) {
101
+ if (secret.length > 0) {
102
+ result = result.split(secret).join("[REDACTED]");
103
+ }
104
+ }
105
+ // 2. Pattern-based redaction
106
+ for (const { regex, replacement } of this.patterns) {
107
+ if (typeof replacement === "function") {
108
+ result = result.replace(regex, replacement);
109
+ }
110
+ else {
111
+ result = result.replace(regex, replacement);
112
+ }
113
+ }
114
+ return result;
115
+ }
116
+ /**
117
+ * Recursively redact an object, array, Error, or primitive data structure.
118
+ */
119
+ redactObject(obj) {
120
+ if (obj === null || obj === undefined) {
121
+ return obj;
122
+ }
123
+ if (typeof obj === "string") {
124
+ return this.redactString(obj);
125
+ }
126
+ if (typeof obj !== "object") {
127
+ return obj;
128
+ }
129
+ if (obj instanceof Error) {
130
+ return this.redactError(obj);
131
+ }
132
+ if (Array.isArray(obj)) {
133
+ return obj.map((item) => this.redactObject(item));
134
+ }
135
+ const sanitized = {};
136
+ for (const [key, value] of Object.entries(obj)) {
137
+ if (/password|secret|token|ticket|cookie|csrf|private_key|privateKey|passphrase/i.test(key) && typeof value === "string") {
138
+ sanitized[key] = "[REDACTED]";
139
+ }
140
+ else {
141
+ sanitized[key] = this.redactObject(value);
142
+ }
143
+ }
144
+ return sanitized;
145
+ }
146
+ /**
147
+ * Redact an Error instance's message and stack trace.
148
+ */
149
+ redactError(err) {
150
+ const clonedError = new err.constructor(this.redactString(err.message));
151
+ if (err.stack) {
152
+ clonedError.stack = this.redactString(err.stack);
153
+ }
154
+ return clonedError;
155
+ }
156
+ }
157
+ export const defaultRedactor = new SecretRedactor();
158
+ export function redactString(input) {
159
+ return defaultRedactor.redactString(input);
160
+ }
161
+ export function redactObject(obj) {
162
+ return defaultRedactor.redactObject(obj);
163
+ }
164
+ export function registerSecret(secret) {
165
+ defaultRedactor.registerSecret(secret);
166
+ }
167
+ export function registerSecrets(secrets) {
168
+ defaultRedactor.registerSecrets(secrets);
169
+ }
170
+ //# sourceMappingURL=redactor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redactor.js","sourceRoot":"","sources":["../../../src/utils/redactor.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "@calltelemetry/ct-lab-mcp",
3
+ "version": "0.1.0",
4
+ "description": "Expanded Model Context Protocol (MCP) server for Call Telemetry lab, fleet, and appliance management across Proxmox VE and VMware ESXi.",
5
+ "type": "module",
6
+ "main": "./dist/src/index.js",
7
+ "types": "./dist/src/index.d.ts",
8
+ "bin": {
9
+ "ct-lab-mcp": "./dist/bin/ct-lab-mcp.js",
10
+ "proxmox-mcp": "./dist/bin/proxmox-mcp.js"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "README.md",
15
+ "LICENSE"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc -p tsconfig.build.json && chmod +x dist/bin/*.js 2>/dev/null || true",
19
+ "typecheck": "tsc --noEmit",
20
+ "pretest": "npm run build",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest",
23
+ "test:coverage": "vitest run --coverage",
24
+ "prepack": "npm run build",
25
+ "prepublishOnly": "npm run build && npm run test",
26
+ "start": "node dist/bin/ct-lab-mcp.js"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "git+https://github.com/calltelemetry/ct-lab-mcp.git"
34
+ },
35
+ "bugs": {
36
+ "url": "https://github.com/calltelemetry/ct-lab-mcp/issues"
37
+ },
38
+ "homepage": "https://github.com/calltelemetry/ct-lab-mcp#readme",
39
+ "keywords": [
40
+ "mcp",
41
+ "model-context-protocol",
42
+ "proxmox",
43
+ "esxi",
44
+ "vmware",
45
+ "hypervisor",
46
+ "slot-scheduler",
47
+ "doppler",
48
+ "calltelemetry",
49
+ "appliance",
50
+ "ssh"
51
+ ],
52
+ "author": "Call Telemetry",
53
+ "license": "MIT",
54
+ "dependencies": {
55
+ "@modelcontextprotocol/sdk": "^1.6.0",
56
+ "commander": "^13.1.0",
57
+ "dotenv": "^16.4.7",
58
+ "express": "^4.21.2",
59
+ "ssh2": "^1.16.0",
60
+ "undici": "^7.4.0",
61
+ "zod": "^3.24.2"
62
+ },
63
+ "devDependencies": {
64
+ "@types/express": "^5.0.0",
65
+ "@types/node": "^22.13.5",
66
+ "@types/ssh2": "^1.15.4",
67
+ "@vitest/coverage-v8": "^3.0.7",
68
+ "tsx": "^4.19.3",
69
+ "typescript": "^5.7.3",
70
+ "vitest": "^3.0.7"
71
+ },
72
+ "engines": {
73
+ "node": ">=20.0.0"
74
+ }
75
+ }