@calltelemetry/ct-lab-mcp 0.1.3 → 0.1.5
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/credentials/resolver.js +1 -1
- package/dist/src/credentials/resolver.js.map +1 -1
- package/dist/src/hypervisors/proxmox/client.d.ts +7 -1
- package/dist/src/hypervisors/proxmox/client.d.ts.map +1 -1
- package/dist/src/hypervisors/proxmox/client.js +142 -3
- package/dist/src/hypervisors/proxmox/client.js.map +1 -1
- package/dist/src/hypervisors/types.d.ts +41 -0
- package/dist/src/hypervisors/types.d.ts.map +1 -1
- package/dist/src/proxmox/mock.d.ts +1 -0
- package/dist/src/proxmox/mock.d.ts.map +1 -1
- package/dist/src/proxmox/mock.js +100 -0
- package/dist/src/proxmox/mock.js.map +1 -1
- package/dist/src/tools/factory-reset.d.ts +54 -0
- package/dist/src/tools/factory-reset.d.ts.map +1 -0
- package/dist/src/tools/factory-reset.js +215 -0
- package/dist/src/tools/factory-reset.js.map +1 -0
- package/dist/src/tools/index.d.ts +2 -0
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +21 -1
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/storage-tools.d.ts +73 -0
- package/dist/src/tools/storage-tools.d.ts.map +1 -0
- package/dist/src/tools/storage-tools.js +265 -0
- package/dist/src/tools/storage-tools.js.map +1 -0
- package/dist/src/utils/license.d.ts +27 -0
- package/dist/src/utils/license.d.ts.map +1 -0
- package/dist/src/utils/license.js +59 -0
- package/dist/src/utils/license.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage & Datastore Management MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* Tools:
|
|
5
|
+
* 1. list_storage - Query datastores, pools, free space, and volume contents
|
|
6
|
+
* 2. list_snapshots - Query VM snapshots across Proxmox and ESXi hosts
|
|
7
|
+
* 3. clean_storage - Delete unreferenced disks, stale ISOs, or snapshots with safety guardrails
|
|
8
|
+
*/
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { ProxmoxErrorCode, createToolErrorResult } from "../types/mcp.js";
|
|
11
|
+
import { logger } from "../utils/logger.js";
|
|
12
|
+
import { telemetry } from "../telemetry/registry.js";
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// 1. list_storage
|
|
15
|
+
// ============================================================================
|
|
16
|
+
export const ListStorageInputShape = {
|
|
17
|
+
host: z
|
|
18
|
+
.enum(["proxmox-lab", "proxmox-mini", "proxmox-minis-lab", "esxi-intel-192-168-123-176", "all"])
|
|
19
|
+
.optional()
|
|
20
|
+
.default("all")
|
|
21
|
+
.describe("Specific host or 'all' to inspect."),
|
|
22
|
+
includeContent: z
|
|
23
|
+
.boolean()
|
|
24
|
+
.optional()
|
|
25
|
+
.default(true)
|
|
26
|
+
.describe("Whether to list detailed volume contents (ISOs, VM disks, backups) inside storage pools."),
|
|
27
|
+
storage: z
|
|
28
|
+
.string()
|
|
29
|
+
.optional()
|
|
30
|
+
.describe("Filter to a specific storage pool name (e.g. 'local', 'local-lvm', 'synology-cisco-isos').")
|
|
31
|
+
};
|
|
32
|
+
export const ListStorageInputSchema = z.object(ListStorageInputShape);
|
|
33
|
+
export async function handleListStorage(args, context) {
|
|
34
|
+
const parsed = ListStorageInputSchema.safeParse(args || {});
|
|
35
|
+
if (!parsed.success) {
|
|
36
|
+
return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, "Invalid arguments for list_storage.");
|
|
37
|
+
}
|
|
38
|
+
const { host, includeContent, storage: targetStorage } = parsed.data;
|
|
39
|
+
const drivers = context.hypervisorManager?.getAllDrivers() || [];
|
|
40
|
+
const matchedDrivers = drivers.filter((d) => {
|
|
41
|
+
if (host === "all")
|
|
42
|
+
return true;
|
|
43
|
+
return d.hostName === host || (host === "proxmox-mini" && d.hostName === "proxmox-minis-lab");
|
|
44
|
+
});
|
|
45
|
+
if (matchedDrivers.length === 0) {
|
|
46
|
+
return createToolErrorResult(ProxmoxErrorCode.HOST_NOT_FOUND, `No matching hypervisor driver found for host '${host}'.`);
|
|
47
|
+
}
|
|
48
|
+
const allPools = [];
|
|
49
|
+
const allContents = [];
|
|
50
|
+
for (const driver of matchedDrivers) {
|
|
51
|
+
if (driver.listStorage) {
|
|
52
|
+
try {
|
|
53
|
+
const pools = await driver.listStorage();
|
|
54
|
+
for (const p of pools) {
|
|
55
|
+
if (!targetStorage || p.storage.toLowerCase() === targetStorage.toLowerCase()) {
|
|
56
|
+
allPools.push(p);
|
|
57
|
+
if (includeContent && driver.listStorageContent && p.active) {
|
|
58
|
+
try {
|
|
59
|
+
const contents = await driver.listStorageContent(p.storage);
|
|
60
|
+
allContents.push(...contents);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
logger.warn(`Failed to query storage content for pool ${p.storage} on ${driver.hostName}:`, err.message);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
logger.error(`Failed to list storage for ${driver.hostName}:`, err.message);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const markdown = formatStorageReport(allPools, allContents);
|
|
75
|
+
return {
|
|
76
|
+
content: [{ type: "text", text: markdown }],
|
|
77
|
+
structuredContent: {
|
|
78
|
+
success: true,
|
|
79
|
+
totalPools: allPools.length,
|
|
80
|
+
pools: allPools,
|
|
81
|
+
contents: allContents
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function formatStorageReport(pools, contents) {
|
|
86
|
+
if (pools.length === 0) {
|
|
87
|
+
return "### 💾 Lab Storage Pools\n\nNo storage pools found.";
|
|
88
|
+
}
|
|
89
|
+
const poolRows = pools.map((p) => {
|
|
90
|
+
const totalGb = (p.totalBytes / (1024 * 1024 * 1024)).toFixed(1);
|
|
91
|
+
const usedGb = (p.usedBytes / (1024 * 1024 * 1024)).toFixed(1);
|
|
92
|
+
const availGb = (p.availableBytes / (1024 * 1024 * 1024)).toFixed(1);
|
|
93
|
+
const pct = Math.round(p.usedFraction * 100);
|
|
94
|
+
const statusIcon = pct > 85 ? "🔴" : pct > 70 ? "🟡" : "🟢";
|
|
95
|
+
return `| **\`${p.hostName}\`** | **\`${p.storage}\`** | \`${p.type}\` | ${totalGb} GB | ${usedGb} GB (${pct}%) | **${availGb} GB** | ${statusIcon} ${p.active ? "Active" : "Inactive"} | \`${p.content}\` |`;
|
|
96
|
+
}).join("\n");
|
|
97
|
+
let contentSection = "";
|
|
98
|
+
if (contents.length > 0) {
|
|
99
|
+
const contentRows = contents.map((c) => {
|
|
100
|
+
const sizeGb = (c.sizeBytes / (1024 * 1024 * 1024)).toFixed(2);
|
|
101
|
+
const vmidStr = c.vmid ? `VM ${c.vmid}` : "N/A (Host/ISO)";
|
|
102
|
+
return `| \`${c.hostName}\` | \`${c.storage}\` | **\`${c.volid}\`** | ${sizeGb} GB | \`${c.content}\` | ${vmidStr} |`;
|
|
103
|
+
}).join("\n");
|
|
104
|
+
contentSection = `\n\n#### 📦 Storage Volume & ISO Content Breakdown\n\n| Host | Storage | Volume ID / ISO | Size | Type | Owner |\n|---|---|---|:---:|:---:|:---:|\n${contentRows}`;
|
|
105
|
+
}
|
|
106
|
+
return `### 💾 Lab Storage Pools & Datastore Analysis
|
|
107
|
+
|
|
108
|
+
| Host | Storage Pool | Type | Total | Used (%) | Free Space | Status | Content Types |
|
|
109
|
+
|---|---|:---:|:---:|:---:|:---:|:---:|---|
|
|
110
|
+
${poolRows}${contentSection}`;
|
|
111
|
+
}
|
|
112
|
+
// ============================================================================
|
|
113
|
+
// 2. list_snapshots
|
|
114
|
+
// ============================================================================
|
|
115
|
+
export const ListSnapshotsInputShape = {
|
|
116
|
+
host: z
|
|
117
|
+
.enum(["proxmox-lab", "proxmox-mini", "proxmox-minis-lab", "esxi-intel-192-168-123-176", "all"])
|
|
118
|
+
.optional()
|
|
119
|
+
.default("all")
|
|
120
|
+
.describe("Specific host or 'all'."),
|
|
121
|
+
vmId: z
|
|
122
|
+
.string()
|
|
123
|
+
.optional()
|
|
124
|
+
.describe("Specific VM ID or name to inspect snapshots for.")
|
|
125
|
+
};
|
|
126
|
+
export const ListSnapshotsInputSchema = z.object(ListSnapshotsInputShape);
|
|
127
|
+
export async function handleListSnapshots(args, context) {
|
|
128
|
+
const parsed = ListSnapshotsInputSchema.safeParse(args || {});
|
|
129
|
+
if (!parsed.success) {
|
|
130
|
+
return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, "Invalid arguments for list_snapshots.");
|
|
131
|
+
}
|
|
132
|
+
const { host, vmId } = parsed.data;
|
|
133
|
+
const drivers = context.hypervisorManager?.getAllDrivers() || [];
|
|
134
|
+
const matchedDrivers = drivers.filter((d) => {
|
|
135
|
+
if (host === "all")
|
|
136
|
+
return true;
|
|
137
|
+
return d.hostName === host || (host === "proxmox-mini" && d.hostName === "proxmox-minis-lab");
|
|
138
|
+
});
|
|
139
|
+
const allSnapshots = [];
|
|
140
|
+
for (const driver of matchedDrivers) {
|
|
141
|
+
if (driver.listSnapshots) {
|
|
142
|
+
if (vmId) {
|
|
143
|
+
try {
|
|
144
|
+
const snaps = await driver.listSnapshots(vmId);
|
|
145
|
+
allSnapshots.push(...snaps);
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
logger.warn(`Failed to get snapshots for VM ${vmId} on ${driver.hostName}:`, err.message);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
const vms = await driver.listVms();
|
|
153
|
+
for (const vm of vms) {
|
|
154
|
+
try {
|
|
155
|
+
const snaps = await driver.listSnapshots(vm.id);
|
|
156
|
+
allSnapshots.push(...snaps);
|
|
157
|
+
}
|
|
158
|
+
catch { }
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const rows = allSnapshots.map((s) => {
|
|
164
|
+
const dateStr = s.snapdate ? s.snapdate.split("T")[0] : "Unknown";
|
|
165
|
+
return `| \`${s.hostName}\` | **${s.vmName}** (\`${s.vmId}\`) | **\`${s.name}\`** | ${dateStr} | ${s.description || "None"} | ${s.vmstate ? "RAM Included" : "Disk Only"} |`;
|
|
166
|
+
}).join("\n");
|
|
167
|
+
const markdown = allSnapshots.length === 0
|
|
168
|
+
? "### 📸 VM Snapshots Analysis\n\nNo VM snapshots found across inspected hosts."
|
|
169
|
+
: `### 📸 VM Snapshots Analysis (${allSnapshots.length} Found)\n\n| Host | VM Name | Snapshot Name | Date | Description | State |\n|---|---|---|:---:|---|:---:|\n${rows}`;
|
|
170
|
+
return {
|
|
171
|
+
content: [{ type: "text", text: markdown }],
|
|
172
|
+
structuredContent: {
|
|
173
|
+
success: true,
|
|
174
|
+
totalSnapshots: allSnapshots.length,
|
|
175
|
+
snapshots: allSnapshots
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
// ============================================================================
|
|
180
|
+
// 3. clean_storage
|
|
181
|
+
// ============================================================================
|
|
182
|
+
export const CleanStorageInputShape = {
|
|
183
|
+
host: z
|
|
184
|
+
.enum(["proxmox-lab", "proxmox-mini", "proxmox-minis-lab", "esxi-intel-192-168-123-176"])
|
|
185
|
+
.describe("Target hypervisor host where the volume or snapshot resides."),
|
|
186
|
+
action: z
|
|
187
|
+
.enum(["delete_volume", "delete_snapshot"])
|
|
188
|
+
.describe("Action to perform: 'delete_volume' (e.g. stale ISO/disk) or 'delete_snapshot'."),
|
|
189
|
+
volumeId: z
|
|
190
|
+
.string()
|
|
191
|
+
.optional()
|
|
192
|
+
.describe("Volume ID to delete (e.g. 'local:iso/AlmaLinux-9-latest-x86_64-dvd.iso' or 'local-lvm:vm-105-disk-0'). Required if action is 'delete_volume'."),
|
|
193
|
+
vmId: z
|
|
194
|
+
.string()
|
|
195
|
+
.optional()
|
|
196
|
+
.describe("VM ID for snapshot deletion. Required if action is 'delete_snapshot'."),
|
|
197
|
+
snapshotName: z
|
|
198
|
+
.string()
|
|
199
|
+
.optional()
|
|
200
|
+
.describe("Snapshot name to delete. Required if action is 'delete_snapshot'.")
|
|
201
|
+
};
|
|
202
|
+
export const CleanStorageInputSchema = z.object(CleanStorageInputShape);
|
|
203
|
+
export async function handleCleanStorage(args, context) {
|
|
204
|
+
const parsed = CleanStorageInputSchema.safeParse(args);
|
|
205
|
+
if (!parsed.success) {
|
|
206
|
+
return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, "Invalid arguments for clean_storage.");
|
|
207
|
+
}
|
|
208
|
+
const { host, action, volumeId, vmId, snapshotName } = parsed.data;
|
|
209
|
+
const driver = context.hypervisorManager?.getDriver(host);
|
|
210
|
+
if (!driver) {
|
|
211
|
+
return createToolErrorResult(ProxmoxErrorCode.HOST_NOT_FOUND, `Hypervisor host '${host}' not found.`);
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
if (action === "delete_volume") {
|
|
215
|
+
if (!volumeId) {
|
|
216
|
+
return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, "'volumeId' is required for action 'delete_volume'.");
|
|
217
|
+
}
|
|
218
|
+
if (!driver.deleteVolume) {
|
|
219
|
+
return createToolErrorResult(ProxmoxErrorCode.OPERATION_NOT_SUPPORTED, `Host '${host}' does not support direct volume deletion.`);
|
|
220
|
+
}
|
|
221
|
+
logger.info(`Deleting volume '${volumeId}' on host '${host}'...`);
|
|
222
|
+
await driver.deleteVolume(volumeId);
|
|
223
|
+
telemetry.emit({
|
|
224
|
+
event: "storage.delete_volume",
|
|
225
|
+
actor: "ct-lab-mcp",
|
|
226
|
+
status: "success",
|
|
227
|
+
hostId: host,
|
|
228
|
+
metadata: { volumeId }
|
|
229
|
+
});
|
|
230
|
+
return {
|
|
231
|
+
content: [{ type: "text", text: `### 🗑️ Volume Deleted Successfully\n\nVolume **\`${volumeId}\`** was deleted from host **\`${host}\`**.` }],
|
|
232
|
+
structuredContent: { success: true, host, volumeId }
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
if (action === "delete_snapshot") {
|
|
236
|
+
if (!vmId || !snapshotName) {
|
|
237
|
+
return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, "'vmId' and 'snapshotName' are required for action 'delete_snapshot'.");
|
|
238
|
+
}
|
|
239
|
+
if (!driver.deleteSnapshot) {
|
|
240
|
+
return createToolErrorResult(ProxmoxErrorCode.OPERATION_NOT_SUPPORTED, `Host '${host}' does not support snapshot deletion.`);
|
|
241
|
+
}
|
|
242
|
+
logger.info(`Deleting snapshot '${snapshotName}' on VM '${vmId}' (${host})...`);
|
|
243
|
+
await driver.deleteSnapshot(vmId, snapshotName);
|
|
244
|
+
telemetry.emit({
|
|
245
|
+
event: "storage.delete_snapshot",
|
|
246
|
+
actor: "ct-lab-mcp",
|
|
247
|
+
status: "success",
|
|
248
|
+
hostId: host,
|
|
249
|
+
vmId,
|
|
250
|
+
metadata: { snapshotName }
|
|
251
|
+
});
|
|
252
|
+
return {
|
|
253
|
+
content: [{ type: "text", text: `### 🗑️ Snapshot Deleted Successfully\n\nSnapshot **\`${snapshotName}\`** on VM **\`${vmId}\`** (${host}) was deleted.` }],
|
|
254
|
+
structuredContent: { success: true, host, vmId, snapshotName }
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, `Unknown action '${action}'.`);
|
|
258
|
+
}
|
|
259
|
+
catch (err) {
|
|
260
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
261
|
+
logger.error(`clean_storage failed on ${host}: ${msg}`);
|
|
262
|
+
return createToolErrorResult(ProxmoxErrorCode.VM_ACTION_FAILED, `Failed to clean storage on '${host}': ${msg}`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=storage-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-tools.js","sourceRoot":"","sources":["../../../src/tools/storage-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAkB,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE1F,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,KAAK,CAAC,CAAC;SAC/F,QAAQ,EAAE;SACV,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,oCAAoC,CAAC;IACjD,cAAc,EAAE,CAAC;SACd,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,0FAA0F,CAAC;IACvG,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,4FAA4F,CAAC;CAC1G,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEtE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAa,EACb,OAAoB;IAEpB,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,qCAAqC,CAAC,CAAC;IACzG,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IACrE,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAEjE,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1C,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QAChC,OAAO,CAAC,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,CAAC,CAAC,QAAQ,KAAK,mBAAmB,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,cAAc,EAAE,iDAAiD,IAAI,IAAI,CAAC,CAAC;IAC3H,CAAC;IAED,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,MAAM,WAAW,GAA2B,EAAE,CAAC;IAE/C,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;gBACzC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;oBACtB,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,aAAa,CAAC,WAAW,EAAE,EAAE,CAAC;wBAC9E,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBACjB,IAAI,cAAc,IAAI,MAAM,CAAC,kBAAkB,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;4BAC5D,IAAI,CAAC;gCACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gCAC5D,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;4BAChC,CAAC;4BAAC,OAAO,GAAQ,EAAE,CAAC;gCAClB,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,OAAO,OAAO,MAAM,CAAC,QAAQ,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;4BAC3G,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,MAAM,CAAC,KAAK,CAAC,8BAA8B,MAAM,CAAC,QAAQ,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAE5D,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC3C,iBAAiB,EAAE;YACjB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,QAAQ,CAAC,MAAM;YAC3B,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,WAAW;SACtB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAwB,EAAE,QAAgC;IACrF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,qDAAqD,CAAC;IAC/D,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/B,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACrE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAE5D,OAAO,SAAS,CAAC,CAAC,QAAQ,cAAc,CAAC,CAAC,OAAO,YAAY,CAAC,CAAC,IAAI,QAAQ,OAAO,SAAS,MAAM,QAAQ,GAAG,UAAU,OAAO,WAAW,UAAU,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,QAAQ,CAAC,CAAC,OAAO,MAAM,CAAC;IAChN,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,IAAI,cAAc,GAAG,EAAE,CAAC;IACxB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/D,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;YAC3D,OAAO,OAAO,CAAC,CAAC,QAAQ,UAAU,CAAC,CAAC,OAAO,YAAY,CAAC,CAAC,KAAK,UAAU,MAAM,WAAW,CAAC,CAAC,OAAO,QAAQ,OAAO,IAAI,CAAC;QACxH,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,cAAc,GAAG,sJAAsJ,WAAW,EAAE,CAAC;IACvL,CAAC;IAED,OAAO;;;;EAIP,QAAQ,GAAG,cAAc,EAAE,CAAC;AAC9B,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,KAAK,CAAC,CAAC;SAC/F,QAAQ,EAAE;SACV,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,yBAAyB,CAAC;IACtC,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,kDAAkD,CAAC;CAChE,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAa,EACb,OAAoB;IAEpB,MAAM,MAAM,GAAG,wBAAwB,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,uCAAuC,CAAC,CAAC;IAC3G,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IACnC,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACjE,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1C,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QAChC,OAAO,CAAC,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,CAAC,CAAC,QAAQ,KAAK,mBAAmB,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAqB,EAAE,CAAC;IAE1C,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;oBAC/C,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;gBAC9B,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,MAAM,CAAC,IAAI,CAAC,kCAAkC,IAAI,OAAO,MAAM,CAAC,QAAQ,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5F,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;oBACrB,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;wBAChD,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;oBAC9B,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBACZ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,OAAO,OAAO,CAAC,CAAC,QAAQ,UAAU,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,IAAI,UAAU,OAAO,MAAM,CAAC,CAAC,WAAW,IAAI,MAAM,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC;IAC/K,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC;QACxC,CAAC,CAAC,+EAA+E;QACjF,CAAC,CAAC,iCAAiC,YAAY,CAAC,MAAM,8GAA8G,IAAI,EAAE,CAAC;IAE7K,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC3C,iBAAiB,EAAE;YACjB,OAAO,EAAE,IAAI;YACb,cAAc,EAAE,YAAY,CAAC,MAAM;YACnC,SAAS,EAAE,YAAY;SACxB;KACF,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,4BAA4B,CAAC,CAAC;SACxF,QAAQ,CAAC,8DAA8D,CAAC;IAC3E,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;SAC1C,QAAQ,CAAC,gFAAgF,CAAC;IAC7F,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,+IAA+I,CAAC;IAC5J,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,uEAAuE,CAAC;IACpF,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,mEAAmE,CAAC;CACjF,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAa,EACb,OAAoB;IAEpB,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,sCAAsC,CAAC,CAAC;IAC1G,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IACnE,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAE1D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,cAAc,EAAE,oBAAoB,IAAI,cAAc,CAAC,CAAC;IACxG,CAAC;IAED,IAAI,CAAC;QACH,IAAI,MAAM,KAAK,eAAe,EAAE,CAAC;YAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,oDAAoD,CAAC,CAAC;YACxH,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;gBACzB,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,SAAS,IAAI,4CAA4C,CAAC,CAAC;YACpI,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,oBAAoB,QAAQ,cAAc,IAAI,MAAM,CAAC,CAAC;YAClE,MAAM,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAEpC,SAAS,CAAC,IAAI,CAAC;gBACb,KAAK,EAAE,uBAAuB;gBAC9B,KAAK,EAAE,YAAY;gBACnB,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,EAAE,QAAQ,EAAE;aACvB,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qDAAqD,QAAQ,kCAAkC,IAAI,OAAO,EAAE,CAAC;gBAC7I,iBAAiB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;aACrD,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,KAAK,iBAAiB,EAAE,CAAC;YACjC,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC3B,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,sEAAsE,CAAC,CAAC;YAC1I,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBAC3B,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,SAAS,IAAI,uCAAuC,CAAC,CAAC;YAC/H,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,sBAAsB,YAAY,YAAY,IAAI,MAAM,IAAI,MAAM,CAAC,CAAC;YAChF,MAAM,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAEhD,SAAS,CAAC,IAAI,CAAC;gBACb,KAAK,EAAE,yBAAyB;gBAChC,KAAK,EAAE,YAAY;gBACnB,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,IAAI;gBACZ,IAAI;gBACJ,QAAQ,EAAE,EAAE,YAAY,EAAE;aAC3B,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,yDAAyD,YAAY,kBAAkB,IAAI,SAAS,IAAI,gBAAgB,EAAE,CAAC;gBAC3J,iBAAiB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE;aAC/D,CAAC;QACJ,CAAC;QAED,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,mBAAmB,MAAM,IAAI,CAAC,CAAC;IACjG,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,2BAA2B,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;QACxD,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,+BAA+B,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;IAClH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call Telemetry Appliance Trial / Demo License Token Generator
|
|
3
|
+
*
|
|
4
|
+
* Mints standard JWT tokens conforming to `Cdrcisco.Token.trial/4`
|
|
5
|
+
* with default HMAC-SHA256 signer.
|
|
6
|
+
*/
|
|
7
|
+
export declare const DEFAULT_LICENSE_SIGNER = "rUWeAj1dpN24ae9OwvBvIepTbZKc5YIdroeL0Ttcjfcuc/ngFSvK2APkjeMmGHGZ";
|
|
8
|
+
export interface LicenseTokenOptions {
|
|
9
|
+
tier?: "Community" | "Essentials" | "Advanced" | "Premium" | "Demo" | "Beta" | string;
|
|
10
|
+
days?: number;
|
|
11
|
+
orgId?: number;
|
|
12
|
+
signer?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface GeneratedLicense {
|
|
15
|
+
token: string;
|
|
16
|
+
tier: string;
|
|
17
|
+
days: number;
|
|
18
|
+
orgId: number;
|
|
19
|
+
issuedAt: string;
|
|
20
|
+
expiresAt: string;
|
|
21
|
+
expiresEpoch: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Generate a valid Call Telemetry trial / demo license JWT.
|
|
25
|
+
*/
|
|
26
|
+
export declare function generateTrialLicenseToken(options?: LicenseTokenOptions): GeneratedLicense;
|
|
27
|
+
//# sourceMappingURL=license.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../../src/utils/license.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,eAAO,MAAM,sBAAsB,qEACiC,CAAC;AAErE,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,WAAW,GAAG,YAAY,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACtF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAUD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,mBAAwB,GAAG,gBAAgB,CA8C7F"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call Telemetry Appliance Trial / Demo License Token Generator
|
|
3
|
+
*
|
|
4
|
+
* Mints standard JWT tokens conforming to `Cdrcisco.Token.trial/4`
|
|
5
|
+
* with default HMAC-SHA256 signer.
|
|
6
|
+
*/
|
|
7
|
+
import { createHmac } from "node:crypto";
|
|
8
|
+
export const DEFAULT_LICENSE_SIGNER = "rUWeAj1dpN24ae9OwvBvIepTbZKc5YIdroeL0Ttcjfcuc/ngFSvK2APkjeMmGHGZ";
|
|
9
|
+
function base64UrlEncode(str) {
|
|
10
|
+
return Buffer.from(str, "utf-8")
|
|
11
|
+
.toString("base64")
|
|
12
|
+
.replace(/=/g, "")
|
|
13
|
+
.replace(/\+/g, "-")
|
|
14
|
+
.replace(/\//g, "_");
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generate a valid Call Telemetry trial / demo license JWT.
|
|
18
|
+
*/
|
|
19
|
+
export function generateTrialLicenseToken(options = {}) {
|
|
20
|
+
const tier = options.tier || "Demo";
|
|
21
|
+
const days = options.days !== undefined ? options.days : 30;
|
|
22
|
+
const orgId = options.orgId || 1;
|
|
23
|
+
const signer = options.signer || process.env.JWT_SECRET || DEFAULT_LICENSE_SIGNER;
|
|
24
|
+
const nowSeconds = Math.floor(Date.now() / 1000);
|
|
25
|
+
const expSeconds = nowSeconds + days * 24 * 60 * 60;
|
|
26
|
+
const header = {
|
|
27
|
+
alg: "HS256",
|
|
28
|
+
typ: "JWT"
|
|
29
|
+
};
|
|
30
|
+
const payload = {
|
|
31
|
+
tier,
|
|
32
|
+
org_id: orgId,
|
|
33
|
+
iat: nowSeconds,
|
|
34
|
+
exp: expSeconds,
|
|
35
|
+
nbf: nowSeconds - 5,
|
|
36
|
+
iss: "calltelemetry_lab_mcp",
|
|
37
|
+
sub: `trial_${tier.toLowerCase()}`
|
|
38
|
+
};
|
|
39
|
+
const encodedHeader = base64UrlEncode(JSON.stringify(header));
|
|
40
|
+
const encodedPayload = base64UrlEncode(JSON.stringify(payload));
|
|
41
|
+
const message = `${encodedHeader}.${encodedPayload}`;
|
|
42
|
+
const hmac = createHmac("sha256", signer);
|
|
43
|
+
hmac.update(message);
|
|
44
|
+
const signature = hmac.digest("base64")
|
|
45
|
+
.replace(/=/g, "")
|
|
46
|
+
.replace(/\+/g, "-")
|
|
47
|
+
.replace(/\//g, "_");
|
|
48
|
+
const token = `${message}.${signature}`;
|
|
49
|
+
return {
|
|
50
|
+
token,
|
|
51
|
+
tier,
|
|
52
|
+
days,
|
|
53
|
+
orgId,
|
|
54
|
+
issuedAt: new Date(nowSeconds * 1000).toISOString(),
|
|
55
|
+
expiresAt: new Date(expSeconds * 1000).toISOString(),
|
|
56
|
+
expiresEpoch: expSeconds
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=license.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../../../src/utils/license.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,sBAAsB,GACjC,kEAAkE,CAAC;AAmBrE,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC;SAC7B,QAAQ,CAAC,QAAQ,CAAC;SAClB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;SACjB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,UAA+B,EAAE;IACzE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,sBAAsB,CAAC;IAElF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,UAAU,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAEpD,MAAM,MAAM,GAAG;QACb,GAAG,EAAE,OAAO;QACZ,GAAG,EAAE,KAAK;KACX,CAAC;IAEF,MAAM,OAAO,GAAG;QACd,IAAI;QACJ,MAAM,EAAE,KAAK;QACb,GAAG,EAAE,UAAU;QACf,GAAG,EAAE,UAAU;QACf,GAAG,EAAE,UAAU,GAAG,CAAC;QACnB,GAAG,EAAE,uBAAuB;QAC5B,GAAG,EAAE,SAAS,IAAI,CAAC,WAAW,EAAE,EAAE;KACnC,CAAC;IAEF,MAAM,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,GAAG,aAAa,IAAI,cAAc,EAAE,CAAC;IAErD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;SACpC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;SACjB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEvB,MAAM,KAAK,GAAG,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC;IAExC,OAAO;QACL,KAAK;QACL,IAAI;QACJ,IAAI;QACJ,KAAK;QACL,QAAQ,EAAE,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;QACnD,SAAS,EAAE,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;QACpD,YAAY,EAAE,UAAU;KACzB,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@calltelemetry/ct-lab-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
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",
|