proxmox-mcps 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 (217) hide show
  1. package/.env.example +60 -0
  2. package/.mcp.json.example +19 -0
  3. package/LICENSE +21 -0
  4. package/README.md +72 -0
  5. package/dist/cli/check-config.d.ts +3 -0
  6. package/dist/cli/check-config.d.ts.map +1 -0
  7. package/dist/cli/check-config.js +29 -0
  8. package/dist/cli/check-config.js.map +1 -0
  9. package/dist/cli/print-tools.d.ts +4 -0
  10. package/dist/cli/print-tools.d.ts.map +1 -0
  11. package/dist/cli/print-tools.js +45 -0
  12. package/dist/cli/print-tools.js.map +1 -0
  13. package/dist/config/env.d.ts +183 -0
  14. package/dist/config/env.d.ts.map +1 -0
  15. package/dist/config/env.js +149 -0
  16. package/dist/config/env.js.map +1 -0
  17. package/dist/config/index.d.ts +26 -0
  18. package/dist/config/index.d.ts.map +1 -0
  19. package/dist/config/index.js +42 -0
  20. package/dist/config/index.js.map +1 -0
  21. package/dist/config/types.d.ts +60 -0
  22. package/dist/config/types.d.ts.map +1 -0
  23. package/dist/config/types.js +50 -0
  24. package/dist/config/types.js.map +1 -0
  25. package/dist/format/response.d.ts +40 -0
  26. package/dist/format/response.d.ts.map +1 -0
  27. package/dist/format/response.js +109 -0
  28. package/dist/format/response.js.map +1 -0
  29. package/dist/index.d.ts +3 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +200 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/jobs/sqlite-store.d.ts +34 -0
  34. package/dist/jobs/sqlite-store.d.ts.map +1 -0
  35. package/dist/jobs/sqlite-store.js +282 -0
  36. package/dist/jobs/sqlite-store.js.map +1 -0
  37. package/dist/jobs/store.d.ts +66 -0
  38. package/dist/jobs/store.d.ts.map +1 -0
  39. package/dist/jobs/store.js +101 -0
  40. package/dist/jobs/store.js.map +1 -0
  41. package/dist/log.d.ts +24 -0
  42. package/dist/log.d.ts.map +1 -0
  43. package/dist/log.js +64 -0
  44. package/dist/log.js.map +1 -0
  45. package/dist/proxmox/auth.d.ts +30 -0
  46. package/dist/proxmox/auth.d.ts.map +1 -0
  47. package/dist/proxmox/auth.js +39 -0
  48. package/dist/proxmox/auth.js.map +1 -0
  49. package/dist/proxmox/client.d.ts +28 -0
  50. package/dist/proxmox/client.d.ts.map +1 -0
  51. package/dist/proxmox/client.js +192 -0
  52. package/dist/proxmox/client.js.map +1 -0
  53. package/dist/proxmox/errors.d.ts +51 -0
  54. package/dist/proxmox/errors.d.ts.map +1 -0
  55. package/dist/proxmox/errors.js +80 -0
  56. package/dist/proxmox/errors.js.map +1 -0
  57. package/dist/proxmox/paths.d.ts +126 -0
  58. package/dist/proxmox/paths.d.ts.map +1 -0
  59. package/dist/proxmox/paths.js +157 -0
  60. package/dist/proxmox/paths.js.map +1 -0
  61. package/dist/proxmox/types.d.ts +255 -0
  62. package/dist/proxmox/types.d.ts.map +1 -0
  63. package/dist/proxmox/types.js +9 -0
  64. package/dist/proxmox/types.js.map +1 -0
  65. package/dist/retry.d.ts +18 -0
  66. package/dist/retry.d.ts.map +1 -0
  67. package/dist/retry.js +50 -0
  68. package/dist/retry.js.map +1 -0
  69. package/dist/safety/policy.d.ts +23 -0
  70. package/dist/safety/policy.d.ts.map +1 -0
  71. package/dist/safety/policy.js +81 -0
  72. package/dist/safety/policy.js.map +1 -0
  73. package/dist/safety/risk.d.ts +3 -0
  74. package/dist/safety/risk.d.ts.map +1 -0
  75. package/dist/safety/risk.js +234 -0
  76. package/dist/safety/risk.js.map +1 -0
  77. package/dist/security/url-guard.d.ts +22 -0
  78. package/dist/security/url-guard.d.ts.map +1 -0
  79. package/dist/security/url-guard.js +166 -0
  80. package/dist/security/url-guard.js.map +1 -0
  81. package/dist/server.d.ts +24 -0
  82. package/dist/server.d.ts.map +1 -0
  83. package/dist/server.js +74 -0
  84. package/dist/server.js.map +1 -0
  85. package/dist/ssh/client.d.ts +32 -0
  86. package/dist/ssh/client.d.ts.map +1 -0
  87. package/dist/ssh/client.js +128 -0
  88. package/dist/ssh/client.js.map +1 -0
  89. package/dist/tools/backup-schedule.d.ts +10 -0
  90. package/dist/tools/backup-schedule.d.ts.map +1 -0
  91. package/dist/tools/backup-schedule.js +194 -0
  92. package/dist/tools/backup-schedule.js.map +1 -0
  93. package/dist/tools/backup.d.ts +7 -0
  94. package/dist/tools/backup.d.ts.map +1 -0
  95. package/dist/tools/backup.js +163 -0
  96. package/dist/tools/backup.js.map +1 -0
  97. package/dist/tools/cluster.d.ts +7 -0
  98. package/dist/tools/cluster.d.ts.map +1 -0
  99. package/dist/tools/cluster.js +20 -0
  100. package/dist/tools/cluster.js.map +1 -0
  101. package/dist/tools/container/config.d.ts +7 -0
  102. package/dist/tools/container/config.d.ts.map +1 -0
  103. package/dist/tools/container/config.js +97 -0
  104. package/dist/tools/container/config.js.map +1 -0
  105. package/dist/tools/container/console.d.ts +7 -0
  106. package/dist/tools/container/console.d.ts.map +1 -0
  107. package/dist/tools/container/console.js +65 -0
  108. package/dist/tools/container/console.js.map +1 -0
  109. package/dist/tools/container/crud.d.ts +7 -0
  110. package/dist/tools/container/crud.d.ts.map +1 -0
  111. package/dist/tools/container/crud.js +362 -0
  112. package/dist/tools/container/crud.js.map +1 -0
  113. package/dist/tools/container/diagnostics.d.ts +7 -0
  114. package/dist/tools/container/diagnostics.d.ts.map +1 -0
  115. package/dist/tools/container/diagnostics.js +115 -0
  116. package/dist/tools/container/diagnostics.js.map +1 -0
  117. package/dist/tools/container/migration.d.ts +7 -0
  118. package/dist/tools/container/migration.d.ts.map +1 -0
  119. package/dist/tools/container/migration.js +134 -0
  120. package/dist/tools/container/migration.js.map +1 -0
  121. package/dist/tools/context.d.ts +21 -0
  122. package/dist/tools/context.d.ts.map +1 -0
  123. package/dist/tools/context.js +2 -0
  124. package/dist/tools/context.js.map +1 -0
  125. package/dist/tools/ha.d.ts +7 -0
  126. package/dist/tools/ha.d.ts.map +1 -0
  127. package/dist/tools/ha.js +241 -0
  128. package/dist/tools/ha.js.map +1 -0
  129. package/dist/tools/helpers.d.ts +15 -0
  130. package/dist/tools/helpers.d.ts.map +1 -0
  131. package/dist/tools/helpers.js +7 -0
  132. package/dist/tools/helpers.js.map +1 -0
  133. package/dist/tools/index.d.ts +10 -0
  134. package/dist/tools/index.d.ts.map +1 -0
  135. package/dist/tools/index.js +66 -0
  136. package/dist/tools/index.js.map +1 -0
  137. package/dist/tools/iso.d.ts +7 -0
  138. package/dist/tools/iso.d.ts.map +1 -0
  139. package/dist/tools/iso.js +131 -0
  140. package/dist/tools/iso.js.map +1 -0
  141. package/dist/tools/jobs.d.ts +11 -0
  142. package/dist/tools/jobs.d.ts.map +1 -0
  143. package/dist/tools/jobs.js +173 -0
  144. package/dist/tools/jobs.js.map +1 -0
  145. package/dist/tools/node-admin.d.ts +10 -0
  146. package/dist/tools/node-admin.d.ts.map +1 -0
  147. package/dist/tools/node-admin.js +361 -0
  148. package/dist/tools/node-admin.js.map +1 -0
  149. package/dist/tools/node-certs.d.ts +7 -0
  150. package/dist/tools/node-certs.d.ts.map +1 -0
  151. package/dist/tools/node-certs.js +36 -0
  152. package/dist/tools/node-certs.js.map +1 -0
  153. package/dist/tools/node-disks.d.ts +7 -0
  154. package/dist/tools/node-disks.d.ts.map +1 -0
  155. package/dist/tools/node-disks.js +100 -0
  156. package/dist/tools/node-disks.js.map +1 -0
  157. package/dist/tools/node-network.d.ts +7 -0
  158. package/dist/tools/node-network.d.ts.map +1 -0
  159. package/dist/tools/node-network.js +102 -0
  160. package/dist/tools/node-network.js.map +1 -0
  161. package/dist/tools/node-services.d.ts +7 -0
  162. package/dist/tools/node-services.d.ts.map +1 -0
  163. package/dist/tools/node-services.js +39 -0
  164. package/dist/tools/node-services.js.map +1 -0
  165. package/dist/tools/node.d.ts +7 -0
  166. package/dist/tools/node.d.ts.map +1 -0
  167. package/dist/tools/node.js +85 -0
  168. package/dist/tools/node.js.map +1 -0
  169. package/dist/tools/pools.d.ts +10 -0
  170. package/dist/tools/pools.d.ts.map +1 -0
  171. package/dist/tools/pools.js +111 -0
  172. package/dist/tools/pools.js.map +1 -0
  173. package/dist/tools/replication.d.ts +7 -0
  174. package/dist/tools/replication.d.ts.map +1 -0
  175. package/dist/tools/replication.js +116 -0
  176. package/dist/tools/replication.js.map +1 -0
  177. package/dist/tools/sdn.d.ts +7 -0
  178. package/dist/tools/sdn.d.ts.map +1 -0
  179. package/dist/tools/sdn.js +358 -0
  180. package/dist/tools/sdn.js.map +1 -0
  181. package/dist/tools/snapshot.d.ts +10 -0
  182. package/dist/tools/snapshot.d.ts.map +1 -0
  183. package/dist/tools/snapshot.js +115 -0
  184. package/dist/tools/snapshot.js.map +1 -0
  185. package/dist/tools/storage-admin.d.ts +9 -0
  186. package/dist/tools/storage-admin.d.ts.map +1 -0
  187. package/dist/tools/storage-admin.js +126 -0
  188. package/dist/tools/storage-admin.js.map +1 -0
  189. package/dist/tools/storage.d.ts +7 -0
  190. package/dist/tools/storage.d.ts.map +1 -0
  191. package/dist/tools/storage.js +20 -0
  192. package/dist/tools/storage.js.map +1 -0
  193. package/dist/tools/tasks.d.ts +11 -0
  194. package/dist/tools/tasks.d.ts.map +1 -0
  195. package/dist/tools/tasks.js +85 -0
  196. package/dist/tools/tasks.js.map +1 -0
  197. package/dist/tools/vm/config.d.ts +28 -0
  198. package/dist/tools/vm/config.d.ts.map +1 -0
  199. package/dist/tools/vm/config.js +221 -0
  200. package/dist/tools/vm/config.js.map +1 -0
  201. package/dist/tools/vm/console.d.ts +9 -0
  202. package/dist/tools/vm/console.d.ts.map +1 -0
  203. package/dist/tools/vm/console.js +141 -0
  204. package/dist/tools/vm/console.js.map +1 -0
  205. package/dist/tools/vm/crud.d.ts +10 -0
  206. package/dist/tools/vm/crud.d.ts.map +1 -0
  207. package/dist/tools/vm/crud.js +333 -0
  208. package/dist/tools/vm/crud.js.map +1 -0
  209. package/dist/tools/vm/diagnostics.d.ts +10 -0
  210. package/dist/tools/vm/diagnostics.d.ts.map +1 -0
  211. package/dist/tools/vm/diagnostics.js +256 -0
  212. package/dist/tools/vm/diagnostics.js.map +1 -0
  213. package/dist/tools/vm/migration.d.ts +7 -0
  214. package/dist/tools/vm/migration.d.ts.map +1 -0
  215. package/dist/tools/vm/migration.js +131 -0
  216. package/dist/tools/vm/migration.js.map +1 -0
  217. package/package.json +74 -0
@@ -0,0 +1,126 @@
1
+ import { z } from "zod";
2
+ import * as paths from "../proxmox/paths.js";
3
+ import { runTool, jsonResult } from "../format/response.js";
4
+ export function registerStorageAdminTools(server, ctx) {
5
+ // Note: `get_storage` is already registered by tools/storage.ts.
6
+ // We only register admin (CRUD) operations here to avoid duplicate registration.
7
+ server.registerTool("list_storages", {
8
+ title: "List storage pools",
9
+ description: "Alias for get_storage — list all storage pools.",
10
+ inputSchema: z.object({}).strict(),
11
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
12
+ }, async () => runTool(ctx, "list_storages", {}, async () => {
13
+ const data = await ctx.client.get(paths.storage());
14
+ return jsonResult(`Storage pools:`, data);
15
+ }));
16
+ server.registerTool("create_storage", {
17
+ title: "Create storage pool",
18
+ description: "Create a new storage pool (lvm, zfspool, nfs, cifs, pbs, dir, btrfs, etc.). HIGH RISK — wrong config can lose data.",
19
+ inputSchema: z
20
+ .object({
21
+ storage: z.string().min(1).regex(/^[a-zA-Z0-9_\-]+$/).describe("Storage ID"),
22
+ type: z
23
+ .enum([
24
+ "dir",
25
+ "nfs",
26
+ "cifs",
27
+ "btrfs",
28
+ "pbs",
29
+ "zfspool",
30
+ "lvm",
31
+ "lvmthin",
32
+ "iscsi",
33
+ "cephfs",
34
+ "rbd",
35
+ "glusterfs",
36
+ "fuse",
37
+ ])
38
+ .describe("Storage type"),
39
+ content: z.array(z.enum(["iso", "vztmpl", "backup", "images", "rootdir", "snippets"])).optional(),
40
+ nodes: z.array(z.string()).optional(),
41
+ enable: z.boolean().default(true),
42
+ shared: z.boolean().optional(),
43
+ // Common fields
44
+ path: z.string().optional(),
45
+ export: z.string().optional(),
46
+ server: z.string().optional(),
47
+ export_vg: z.string().optional(),
48
+ vgname: z.string().optional(),
49
+ thinpool: z.string().optional(),
50
+ pool: z.string().optional(),
51
+ fs: z.enum(["ext4", "xfs", "zfs"]).optional(),
52
+ options: z.string().optional(),
53
+ maxfiles: z.number().int().min(1).optional(),
54
+ prune_backups: z.string().optional(),
55
+ username: z.string().optional(),
56
+ password: z.string().optional(),
57
+ domain: z.string().optional(),
58
+ datastore: z.string().optional(),
59
+ namespace: z.string().optional(),
60
+ fingerprint: z.string().optional(),
61
+ approval_token: z.string().optional(),
62
+ })
63
+ .strict(),
64
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },
65
+ }, async (args) => runTool(ctx, "create_storage", args, async () => {
66
+ const body = { storage: args.storage, type: args.type };
67
+ for (const [k, v] of Object.entries(args)) {
68
+ if (k === "storage" || k === "type" || k === "approval_token" || v === undefined)
69
+ continue;
70
+ if (k === "content" && Array.isArray(v))
71
+ body.content = v.join(",");
72
+ else if (k === "nodes" && Array.isArray(v))
73
+ body.nodes = v.join(",");
74
+ else
75
+ body[k] = typeof v === "boolean" ? (v ? 1 : 0) : v;
76
+ }
77
+ await ctx.client.post(paths.storageCreate(), body);
78
+ return jsonResult(`Storage ${args.storage} created.`, { storage: args.storage });
79
+ }));
80
+ server.registerTool("update_storage", {
81
+ title: "Update storage pool",
82
+ description: "Update an existing storage pool. HIGH RISK — may disrupt running VMs.",
83
+ inputSchema: z
84
+ .object({
85
+ storage: z.string().min(1),
86
+ content: z.array(z.enum(["iso", "vztmpl", "backup", "images", "rootdir", "snippets"])).optional(),
87
+ nodes: z.array(z.string()).optional(),
88
+ enable: z.boolean().optional(),
89
+ shared: z.boolean().optional(),
90
+ prune_backups: z.string().optional(),
91
+ maxfiles: z.number().int().optional(),
92
+ approval_token: z.string().optional(),
93
+ })
94
+ .strict(),
95
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },
96
+ }, async (args) => runTool(ctx, "update_storage", args, async () => {
97
+ const body = {};
98
+ for (const [k, v] of Object.entries(args)) {
99
+ if (k === "storage" || k === "approval_token" || v === undefined)
100
+ continue;
101
+ if (k === "content" && Array.isArray(v))
102
+ body.content = v.join(",");
103
+ else if (k === "nodes" && Array.isArray(v))
104
+ body.nodes = v.join(",");
105
+ else
106
+ body[k] = typeof v === "boolean" ? (v ? 1 : 0) : v;
107
+ }
108
+ await ctx.client.put(paths.storageUpdate(args.storage), body);
109
+ return jsonResult(`Storage ${args.storage} updated.`, { storage: args.storage });
110
+ }));
111
+ server.registerTool("delete_storage", {
112
+ title: "Delete storage pool",
113
+ description: "Delete a storage pool from Proxmox config. Underlying disk/files are NOT removed (Proxmox only un-registers the pool). DESTRUCTIVE — VMs/CTs using it lose access.",
114
+ inputSchema: z
115
+ .object({
116
+ storage: z.string().min(1),
117
+ approval_token: z.string().optional(),
118
+ })
119
+ .strict(),
120
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },
121
+ }, async ({ storage, approval_token }) => runTool(ctx, "delete_storage", { storage, approval_token }, async () => {
122
+ await ctx.client.delete(paths.storageUpdate(storage));
123
+ return jsonResult(`Storage ${storage} deleted.`, { storage });
124
+ }));
125
+ }
126
+ //# sourceMappingURL=storage-admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-admin.js","sourceRoot":"","sources":["../../src/tools/storage-admin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Storage tools: get_storage.
3
+ */
4
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import type { ToolContext } from "./context.js";
6
+ export declare function registerStorageTools(server: McpServer, ctx: ToolContext): void;
7
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/tools/storage.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAqB9E"}
@@ -0,0 +1,20 @@
1
+ import { z } from "zod";
2
+ import * as paths from "../proxmox/paths.js";
3
+ import { runTool, jsonResult } from "../format/response.js";
4
+ export function registerStorageTools(server, ctx) {
5
+ server.registerTool("get_storage", {
6
+ title: "List Proxmox storage pools",
7
+ description: "List all configured storage pools cluster-wide with type, content types, and aggregate usage.",
8
+ inputSchema: z.object({}).strict(),
9
+ annotations: {
10
+ readOnlyHint: true,
11
+ destructiveHint: false,
12
+ idempotentHint: true,
13
+ openWorldHint: false,
14
+ },
15
+ }, async () => runTool(ctx, "get_storage", {}, async () => {
16
+ const data = await ctx.client.get(paths.storage());
17
+ return jsonResult("Storage:", data);
18
+ }));
19
+ }
20
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/tools/storage.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,KAAK,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,GAAgB;IACtE,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,4BAA4B;QACnC,WAAW,EACT,+FAA+F;QACjG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;QAClC,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,IAAI,EAAE,CACT,OAAO,CAAC,GAAG,EAAE,aAAa,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,OAAO,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Task tools: list_tasks, get_task, get_task_log.
3
+ *
4
+ * A Proxmox "task" is one UPID — any long-running operation. We expose a
5
+ * thin wrapper around the Proxmox task endpoints; full job tracking with
6
+ * retries/cancellation lives in tools/jobs.ts.
7
+ */
8
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
+ import type { ToolContext } from "./context.js";
10
+ export declare function registerTasksTools(server: McpServer, ctx: ToolContext): void;
11
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAkG5E"}
@@ -0,0 +1,85 @@
1
+ import { z } from "zod";
2
+ import * as paths from "../proxmox/paths.js";
3
+ import { runTool, jsonResult } from "../format/response.js";
4
+ export function registerTasksTools(server, ctx) {
5
+ server.registerTool("list_tasks", {
6
+ title: "List recent cluster tasks",
7
+ description: "List recent Proxmox tasks cluster-wide (UPIDs). Useful for finding background work and diagnosing failures.",
8
+ inputSchema: z
9
+ .object({
10
+ vmid: z
11
+ .string()
12
+ .regex(/^\d+$/)
13
+ .optional()
14
+ .describe("Filter by VM or container ID"),
15
+ limit: z
16
+ .number()
17
+ .int()
18
+ .min(1)
19
+ .max(500)
20
+ .optional()
21
+ .describe("Maximum number of tasks to return (default 50)"),
22
+ })
23
+ .strict(),
24
+ annotations: {
25
+ readOnlyHint: true,
26
+ destructiveHint: false,
27
+ idempotentHint: true,
28
+ openWorldHint: false,
29
+ },
30
+ }, async ({ vmid, limit }) => runTool(ctx, "list_tasks", { vmid, limit }, async () => {
31
+ const data = await ctx.client.get(paths.clusterTasks());
32
+ const filtered = data.filter((t) => {
33
+ if (!vmid)
34
+ return true;
35
+ return String(t.id ?? "").includes(`:${vmid}`);
36
+ });
37
+ return jsonResult(`Tasks (showing ${Math.min(filtered.length, limit ?? 50)}):`, filtered.slice(0, limit ?? 50));
38
+ }));
39
+ server.registerTool("get_task", {
40
+ title: "Get task status",
41
+ description: "Get the current status of a Proxmox task by its UPID (e.g. 'UPID:pve:000B5C66:...').",
42
+ inputSchema: z
43
+ .object({
44
+ node: z.string().min(1).describe("Node that owns the task"),
45
+ upid: z.string().min(1).describe("Task UPID"),
46
+ })
47
+ .strict(),
48
+ annotations: {
49
+ readOnlyHint: true,
50
+ destructiveHint: false,
51
+ idempotentHint: true,
52
+ openWorldHint: false,
53
+ },
54
+ }, async ({ node, upid }) => runTool(ctx, "get_task", { node, upid }, async () => {
55
+ const data = await ctx.client.get(paths.taskStatus(node, upid));
56
+ return jsonResult(`Task ${upid} status:`, data);
57
+ }));
58
+ server.registerTool("get_task_log", {
59
+ title: "Get task log",
60
+ description: "Stream log lines from a Proxmox task (UPID). Useful for diagnosing failures.",
61
+ inputSchema: z
62
+ .object({
63
+ node: z.string().min(1).describe("Node that owns the task"),
64
+ upid: z.string().min(1).describe("Task UPID"),
65
+ limit: z
66
+ .number()
67
+ .int()
68
+ .min(1)
69
+ .max(5000)
70
+ .optional()
71
+ .describe("Number of log lines (default 100)"),
72
+ })
73
+ .strict(),
74
+ annotations: {
75
+ readOnlyHint: true,
76
+ destructiveHint: false,
77
+ idempotentHint: true,
78
+ openWorldHint: false,
79
+ },
80
+ }, async ({ node, upid, limit }) => runTool(ctx, "get_task_log", { node, upid, limit }, async () => {
81
+ const data = await ctx.client.get(paths.taskLog(node, upid, limit ?? 100));
82
+ return jsonResult(`Task ${upid} log:`, data);
83
+ }));
84
+ }
85
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,KAAK,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,GAAgB;IACpE,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,2BAA2B;QAClC,WAAW,EACT,6GAA6G;QAC/G,WAAW,EAAE,CAAC;aACX,MAAM,CAAC;YACN,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,KAAK,CAAC,OAAO,CAAC;iBACd,QAAQ,EAAE;iBACV,QAAQ,CAAC,8BAA8B,CAAC;YAC3C,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,gDAAgD,CAAC;SAC9D,CAAC;aACD,MAAM,EAAE;QACX,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CACxB,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAY,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAI,IAAuC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACrE,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvB,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,kBAAkB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IAClH,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,UAAU,EACV;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,sFAAsF;QACxF,WAAW,EAAE,CAAC;aACX,MAAM,CAAC;YACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YAC3D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;SAC9C,CAAC;aACD,MAAM,EAAE;QACX,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CACvB,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAChE,OAAO,UAAU,CAAC,QAAQ,IAAI,UAAU,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,8EAA8E;QAC3F,WAAW,EAAE,CAAC;aACX,MAAM,CAAC;YACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YAC3D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC7C,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,IAAI,CAAC;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,mCAAmC,CAAC;SACjD,CAAC;aACD,MAAM,EAAE;QACX,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAC9B,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC;QAC3E,OAAO,UAAU,CAAC,QAAQ,IAAI,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * VM Config & cloud-init tools.
3
+ *
4
+ * PUT /nodes/{node}/qemu/{vmid}/config — patch any single config key.
5
+ * Resize, regenerate MAC/UUID, set cloud-init drive, view pending changes.
6
+ */
7
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
+ import type { ToolContext } from "../context.js";
9
+ /**
10
+ * Allowlist of VM config keys that may be modified via `update_vm_config`.
11
+ * Dangerous keys (`args`, `hostpci*`, `usb*`, `machine`, `smbios1`, `numa*`,
12
+ * `bios`, `boot`, `cpuflags`, …) are NOT included — they can attach raw
13
+ * host devices, override SMBIOS, change QEMU machine type, or smuggle
14
+ * attacker-controlled QEMU command-line args. Callers that need them must
15
+ * use the Proxmox UI/API directly.
16
+ *
17
+ * Disk and NIC slots (scsi0..N, virtio0..N, sata0..N, ide0..N, net0..N)
18
+ * are allowed via `DISK_NIC_PATTERN`.
19
+ */
20
+ export declare const VM_CONFIG_ALLOWED_KEYS: ReadonlySet<string>;
21
+ export declare const DISK_NIC_PATTERN: RegExp;
22
+ /**
23
+ * Validate that every key in the user-supplied config dict is allowed.
24
+ * Returns the list of rejected keys (empty if all good).
25
+ */
26
+ export declare function findDisallowedConfigKeys(config: Record<string, unknown>): string[];
27
+ export declare function registerVmConfigTools(server: McpServer, ctx: ToolContext): void;
28
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/tools/vm/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAIjD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,MAAM,CAoBrD,CAAC;AAEH,eAAO,MAAM,gBAAgB,QAAoC,CAAC;AAElE;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,EAAE,CAQV;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA6M/E"}
@@ -0,0 +1,221 @@
1
+ import { z } from "zod";
2
+ import * as paths from "../../proxmox/paths.js";
3
+ import { runTool, jsonResult } from "../../format/response.js";
4
+ import { trackUpid } from "../helpers.js";
5
+ /**
6
+ * Allowlist of VM config keys that may be modified via `update_vm_config`.
7
+ * Dangerous keys (`args`, `hostpci*`, `usb*`, `machine`, `smbios1`, `numa*`,
8
+ * `bios`, `boot`, `cpuflags`, …) are NOT included — they can attach raw
9
+ * host devices, override SMBIOS, change QEMU machine type, or smuggle
10
+ * attacker-controlled QEMU command-line args. Callers that need them must
11
+ * use the Proxmox UI/API directly.
12
+ *
13
+ * Disk and NIC slots (scsi0..N, virtio0..N, sata0..N, ide0..N, net0..N)
14
+ * are allowed via `DISK_NIC_PATTERN`.
15
+ */
16
+ export const VM_CONFIG_ALLOWED_KEYS = new Set([
17
+ // CPU / memory
18
+ "cores",
19
+ "memory",
20
+ "balloon",
21
+ "vcpus",
22
+ "cpulimit",
23
+ "cpuunits",
24
+ // Boot & runtime
25
+ "ostype",
26
+ "name",
27
+ "description",
28
+ "onboot",
29
+ "startup",
30
+ "protection",
31
+ "agent",
32
+ "keyboard",
33
+ "hotplug",
34
+ "freeze",
35
+ "tags",
36
+ ]);
37
+ export const DISK_NIC_PATTERN = /^(scsi|virtio|sata|ide|net)\d+$/;
38
+ /**
39
+ * Validate that every key in the user-supplied config dict is allowed.
40
+ * Returns the list of rejected keys (empty if all good).
41
+ */
42
+ export function findDisallowedConfigKeys(config) {
43
+ const rejected = [];
44
+ for (const key of Object.keys(config)) {
45
+ if (VM_CONFIG_ALLOWED_KEYS.has(key))
46
+ continue;
47
+ if (DISK_NIC_PATTERN.test(key))
48
+ continue;
49
+ rejected.push(key);
50
+ }
51
+ return rejected;
52
+ }
53
+ export function registerVmConfigTools(server, ctx) {
54
+ server.registerTool("update_vm_config", {
55
+ title: "Update VM config",
56
+ description: "Patch one or more VM configuration keys (cores, memory, scsi0 size, net0, ostype, etc.). Use current=true to update a running VM where supported. Only a safe allowlist of keys is accepted — keys that can attach host PCI/USB devices, override SMBIOS, or change the QEMU machine type are rejected.",
57
+ inputSchema: z
58
+ .object({
59
+ node: z.string().min(1),
60
+ vmid: z.string().regex(/^\d+$/),
61
+ current: z.boolean().optional().describe("Apply to running VM where supported"),
62
+ approval_token: z.string().optional().describe("Approval token for high-risk operation"),
63
+ // Record of config keys; validation of each key happens in the handler.
64
+ config: z
65
+ .record(z.union([z.string(), z.number(), z.boolean()]))
66
+ .describe("Config keys to update, e.g. {\"cores\":4,\"memory\":4096}"),
67
+ })
68
+ .strict(),
69
+ annotations: {
70
+ readOnlyHint: false,
71
+ destructiveHint: false,
72
+ idempotentHint: true,
73
+ openWorldHint: true,
74
+ },
75
+ }, async (args) => runTool(ctx, "update_vm_config", args, async () => {
76
+ const config = (args.config ?? {});
77
+ const rejected = findDisallowedConfigKeys(config);
78
+ if (rejected.length > 0) {
79
+ throw new Error(`update_vm_config rejected ${rejected.length} disallowed key(s): ${rejected.join(", ")}. ` +
80
+ `Dangerous keys (args, hostpci*, usb*, machine, smbios1, numa*, bios, boot, cpuflags, …) ` +
81
+ `are not exposed via this tool — modify them through the Proxmox API/UI directly.`);
82
+ }
83
+ if (Object.keys(config).length === 0) {
84
+ return jsonResult(`No changes.`, { node: args.node, vmid: args.vmid });
85
+ }
86
+ const upid = await ctx.client.post(paths.qemuConfig(args.node, args.vmid), config);
87
+ const job = trackUpid(ctx, upid, {
88
+ node: args.node,
89
+ tool: "update_vm_config",
90
+ args: { node: args.node, vmid: args.vmid, keys: Object.keys(config) },
91
+ });
92
+ return jsonResult(`VM ${args.vmid} config update started.`, { job_id: job.job_id, upid });
93
+ }));
94
+ server.registerTool("resize_vm_disk", {
95
+ title: "Resize VM disk",
96
+ description: "Resize a VM disk (e.g. scsi0, virtio0). Use a '+N' suffix on size to grow, or absolute size like '50G'.",
97
+ inputSchema: z
98
+ .object({
99
+ node: z.string().min(1),
100
+ vmid: z.string().regex(/^\d+$/),
101
+ disk: z.string().min(1).describe("Disk identifier (e.g. scsi0, virtio0)"),
102
+ size: z.string().min(1).describe("New size (e.g. '50G', '+20G')"),
103
+ })
104
+ .strict(),
105
+ annotations: {
106
+ readOnlyHint: false,
107
+ destructiveHint: false,
108
+ idempotentHint: false,
109
+ openWorldHint: true,
110
+ },
111
+ }, async ({ node, vmid, disk, size }) => runTool(ctx, "resize_vm_disk", { node, vmid, disk, size }, async () => {
112
+ const upid = await ctx.client.put(paths.qemuResize(node, vmid, disk), { size });
113
+ const job = trackUpid(ctx, upid, {
114
+ node,
115
+ tool: "resize_vm_disk",
116
+ args: { node, vmid, disk, size },
117
+ });
118
+ return jsonResult(`VM ${vmid} disk ${disk} resize started.`, { job_id: job.job_id, upid });
119
+ }));
120
+ server.registerTool("regenerate_vm_config", {
121
+ title: "Regenerate VM identity",
122
+ description: "Regenerate the VM's MAC addresses and (optionally) SMBIOS UUID. Useful after cloning.",
123
+ inputSchema: z
124
+ .object({
125
+ node: z.string().min(1),
126
+ vmid: z.string().regex(/^\d+$/),
127
+ force: z.boolean().optional().describe("Regenerate even if VM has a custom MAC"),
128
+ })
129
+ .strict(),
130
+ annotations: {
131
+ readOnlyHint: false,
132
+ destructiveHint: false,
133
+ idempotentHint: false,
134
+ openWorldHint: true,
135
+ },
136
+ }, async ({ node, vmid, force }) => runTool(ctx, "regenerate_vm_config", { node, vmid, force }, async () => {
137
+ const upid = await ctx.client.post(paths.qemuVm(node, vmid), {
138
+ regenerate: 1,
139
+ ...(force ? { force: 1 } : {}),
140
+ });
141
+ const job = trackUpid(ctx, upid, {
142
+ node,
143
+ tool: "regenerate_vm_config",
144
+ args: { node, vmid, force },
145
+ });
146
+ return jsonResult(`VM ${vmid} identity regeneration started.`, { job_id: job.job_id, upid });
147
+ }));
148
+ server.registerTool("set_vm_cloudinit", {
149
+ title: "Update cloud-init drive",
150
+ description: "Set cloud-init parameters (user, password, SSH keys, IP config, DNS, search domain) and regenerate the cloud-init ISO.",
151
+ inputSchema: z
152
+ .object({
153
+ node: z.string().min(1),
154
+ vmid: z.string().regex(/^\d+$/),
155
+ ciuser: z.string().optional().describe("Cloud-init user"),
156
+ cipassword: z.string().optional().describe("Cloud-init password (redacted in logs)"),
157
+ sshkeys: z.string().optional().describe("URL-encoded SSH public keys"),
158
+ ipconfig0: z.string().optional().describe("e.g. 'ip=dhcp' or 'ip=10.0.0.10/24,gw=10.0.0.1'"),
159
+ nameserver: z.string().optional().describe("DNS servers"),
160
+ searchdomain: z.string().optional().describe("DNS search domain"),
161
+ regenerate: z.boolean().default(true).describe("Regenerate cloud-init ISO after update"),
162
+ })
163
+ .strict(),
164
+ annotations: {
165
+ readOnlyHint: false,
166
+ destructiveHint: false,
167
+ idempotentHint: false,
168
+ openWorldHint: true,
169
+ },
170
+ }, async (args) => runTool(ctx, "set_vm_cloudinit", args, async () => {
171
+ // Update each non-empty param via PUT /config
172
+ const cfgBody = {};
173
+ if (args.ciuser !== undefined)
174
+ cfgBody.ciuser = args.ciuser;
175
+ if (args.cipassword !== undefined)
176
+ cfgBody.cipassword = args.cipassword;
177
+ if (args.sshkeys !== undefined)
178
+ cfgBody.sshkeys = args.sshkeys;
179
+ if (args.ipconfig0 !== undefined)
180
+ cfgBody.ipconfig0 = args.ipconfig0;
181
+ if (args.nameserver !== undefined)
182
+ cfgBody.nameserver = args.nameserver;
183
+ if (args.searchdomain !== undefined)
184
+ cfgBody.searchdomain = args.searchdomain;
185
+ if (Object.keys(cfgBody).length > 0) {
186
+ await ctx.client.post(paths.qemuConfig(args.node, args.vmid), cfgBody);
187
+ }
188
+ let upid;
189
+ let jobId;
190
+ if (args.regenerate) {
191
+ upid = await ctx.client.post(paths.qemuCloudinit(args.node, args.vmid));
192
+ const job = trackUpid(ctx, upid, {
193
+ node: args.node,
194
+ tool: "set_vm_cloudinit",
195
+ args: { node: args.node, vmid: args.vmid, regenerate: true },
196
+ });
197
+ jobId = job.job_id;
198
+ }
199
+ return jsonResult(`Cloud-init updated for VM ${args.vmid}.`, { job_id: jobId, upid });
200
+ }));
201
+ server.registerTool("get_vm_pending", {
202
+ title: "Get pending VM config",
203
+ description: "Return pending config values not yet applied (only present when running config has pending changes).",
204
+ inputSchema: z
205
+ .object({
206
+ node: z.string().min(1),
207
+ vmid: z.string().regex(/^\d+$/),
208
+ })
209
+ .strict(),
210
+ annotations: {
211
+ readOnlyHint: true,
212
+ destructiveHint: false,
213
+ idempotentHint: true,
214
+ openWorldHint: false,
215
+ },
216
+ }, async ({ node, vmid }) => runTool(ctx, "get_vm_pending", { node, vmid }, async () => {
217
+ const data = await ctx.client.get(paths.qemuPending(node, vmid));
218
+ return jsonResult(`Pending config for VM ${vmid}:`, data);
219
+ }));
220
+ }
221
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/tools/vm/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * VM Console & remote access tools.
3
+ *
4
+ * Returns VNC/SPICE/terminal tickets that a frontend can use to open a console.
5
+ */
6
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
+ import type { ToolContext } from "../context.js";
8
+ export declare function registerVmConsoleTools(server: McpServer, ctx: ToolContext): void;
9
+ //# sourceMappingURL=console.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../../src/tools/vm/console.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAyKhF"}