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 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACzD,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,cAAc,YAAY,CAAC;AAK3B;;GAEG;AACH,wBAAgB,UAAU,IAAI,SAAS,CAKtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,CAK/C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAGlC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Config entrypoint. Loads .env, parses env, returns AppConfig.
3
+ *
4
+ * Usage:
5
+ * import { loadConfig } from "./config/index.js";
6
+ * const cfg = loadConfig();
7
+ */
8
+ import "dotenv/config";
9
+ import { parseEnv, loggerConfigFromEnv } from "./env.js";
10
+ import { buildAppConfig } from "./types.js";
11
+ export { parseEnv, loggerConfigFromEnv } from "./env.js";
12
+ export * from "./types.js";
13
+ let _config = null;
14
+ let _loggerConfig = null;
15
+ /**
16
+ * Load (and cache) the AppConfig. Subsequent calls return the cached value.
17
+ */
18
+ export function loadConfig() {
19
+ if (_config)
20
+ return _config;
21
+ const env = parseEnv(process.env);
22
+ _config = buildAppConfig(env);
23
+ return _config;
24
+ }
25
+ /**
26
+ * Load (and cache) the LoggerConfig.
27
+ */
28
+ export function loadLoggerConfig() {
29
+ if (_loggerConfig)
30
+ return _loggerConfig;
31
+ const env = parseEnv(process.env);
32
+ _loggerConfig = loggerConfigFromEnv(env);
33
+ return _loggerConfig;
34
+ }
35
+ /**
36
+ * Reset cached config (tests).
37
+ */
38
+ export function resetConfig() {
39
+ _config = null;
40
+ _loggerConfig = null;
41
+ }
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,cAAc,EAAkB,MAAM,YAAY,CAAC;AAG5D,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEzD,cAAc,YAAY,CAAC;AAE3B,IAAI,OAAO,GAAqB,IAAI,CAAC;AACrC,IAAI,aAAa,GAAwB,IAAI,CAAC;AAE9C;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IACxC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,aAAa,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,GAAG,IAAI,CAAC;IACf,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Strongly-typed config derived from validated env.
3
+ *
4
+ * After env validation, we normalize into AppConfig — the value object every
5
+ * module reads from. No module should re-read process.env.
6
+ */
7
+ import type { EnvInput } from "./env.js";
8
+ export interface ProxmoxConfig {
9
+ host: string;
10
+ port: number;
11
+ user: string;
12
+ tokenName: string;
13
+ tokenValue: string;
14
+ verifySsl: boolean;
15
+ timeoutMs: number;
16
+ service: "PVE" | "PMG" | "PBS";
17
+ }
18
+ export interface SafetyConfig {
19
+ devMode: boolean;
20
+ dangerouslyAllowDestructive: boolean;
21
+ approvalToken: string | null;
22
+ auditOnly: boolean;
23
+ }
24
+ export interface SshConfig {
25
+ user: string;
26
+ port: number;
27
+ keyFile: string | null;
28
+ password: string | null;
29
+ hostOverrides: Record<string, string>;
30
+ knownHostsFile: string | null;
31
+ strictHostKeyChecking: boolean;
32
+ }
33
+ export interface RetryJobConfig {
34
+ retryMax: number;
35
+ retryBaseMs: number;
36
+ jobTtlHours: number;
37
+ jobStore: "memory" | "sqlite";
38
+ jobSqlitePath: string;
39
+ /** HTTP transport host/port for non-stdio modes. */
40
+ httpHost: string;
41
+ httpPort: number;
42
+ }
43
+ export interface DownloadGuardConfig {
44
+ allowedSchemes: ReadonlyArray<string>;
45
+ allowedHosts: ReadonlyArray<string>;
46
+ }
47
+ export interface AppConfig {
48
+ proxmox: ProxmoxConfig;
49
+ safety: SafetyConfig;
50
+ ssh: SshConfig;
51
+ retryJob: RetryJobConfig;
52
+ download: DownloadGuardConfig;
53
+ logLevel: "debug" | "info" | "warn" | "error";
54
+ logPretty: boolean;
55
+ }
56
+ /**
57
+ * Build AppConfig from validated env input.
58
+ */
59
+ export declare function buildAppConfig(env: EnvInput): AppConfig;
60
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,2BAA2B,EAAE,OAAO,CAAC;IACrC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,GAAG,EAAE,SAAS,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9C,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,QAAQ,GAAG,SAAS,CA8CvD"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Build AppConfig from validated env input.
3
+ */
4
+ export function buildAppConfig(env) {
5
+ return {
6
+ proxmox: {
7
+ host: env.PROXMOX_HOST,
8
+ port: env.PROXMOX_PORT,
9
+ user: env.PROXMOX_USER,
10
+ tokenName: env.PROXMOX_TOKEN_NAME,
11
+ tokenValue: env.PROXMOX_TOKEN_VALUE,
12
+ verifySsl: env.PROXMOX_VERIFY_SSL,
13
+ timeoutMs: env.PROXMOX_TIMEOUT_MS,
14
+ service: env.PROXMOX_SERVICE,
15
+ },
16
+ safety: {
17
+ devMode: env.PROXMOX_DEV_MODE,
18
+ dangerouslyAllowDestructive: env.PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE,
19
+ approvalToken: env.PROXMOX_MCP_APPROVAL_TOKEN && env.PROXMOX_MCP_APPROVAL_TOKEN.length >= 8
20
+ ? env.PROXMOX_MCP_APPROVAL_TOKEN
21
+ : null,
22
+ auditOnly: env.PROXMOX_MCP_AUDIT_ONLY,
23
+ },
24
+ ssh: {
25
+ user: env.PROXMOX_SSH_USER,
26
+ port: env.PROXMOX_SSH_PORT,
27
+ keyFile: env.PROXMOX_SSH_KEY_FILE || null,
28
+ password: env.PROXMOX_SSH_PASSWORD || null,
29
+ hostOverrides: env.PROXMOX_SSH_HOST_OVERRIDES ?? {},
30
+ knownHostsFile: env.PROXMOX_SSH_KNOWN_HOSTS_FILE || null,
31
+ strictHostKeyChecking: env.PROXMOX_SSH_STRICT_HOST_KEY_CHECKING,
32
+ },
33
+ retryJob: {
34
+ retryMax: env.PROXMOX_MCP_RETRY_MAX,
35
+ retryBaseMs: env.PROXMOX_MCP_RETRY_BASE_MS,
36
+ jobTtlHours: env.PROXMOX_MCP_JOB_TTL_HOURS,
37
+ jobStore: env.PROXMOX_MCP_JOB_STORE,
38
+ jobSqlitePath: env.PROXMOX_MCP_JOB_SQLITE_PATH,
39
+ httpHost: env.MCP_HOST,
40
+ httpPort: env.MCP_PORT,
41
+ },
42
+ download: {
43
+ allowedSchemes: env.PROXMOX_DOWNLOAD_ALLOWED_SCHEMES,
44
+ allowedHosts: env.PROXMOX_DOWNLOAD_ALLOWED_HOSTS,
45
+ },
46
+ logLevel: env.LOG_LEVEL,
47
+ logPretty: env.LOG_PRETTY,
48
+ };
49
+ }
50
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AA8DA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAa;IAC1C,OAAO;QACL,OAAO,EAAE;YACP,IAAI,EAAE,GAAG,CAAC,YAAY;YACtB,IAAI,EAAE,GAAG,CAAC,YAAY;YACtB,IAAI,EAAE,GAAG,CAAC,YAAY;YACtB,SAAS,EAAE,GAAG,CAAC,kBAAkB;YACjC,UAAU,EAAE,GAAG,CAAC,mBAAmB;YACnC,SAAS,EAAE,GAAG,CAAC,kBAAkB;YACjC,SAAS,EAAE,GAAG,CAAC,kBAAkB;YACjC,OAAO,EAAE,GAAG,CAAC,eAAe;SAC7B;QACD,MAAM,EAAE;YACN,OAAO,EAAE,GAAG,CAAC,gBAAgB;YAC7B,2BAA2B,EAAE,GAAG,CAAC,qCAAqC;YACtE,aAAa,EACX,GAAG,CAAC,0BAA0B,IAAI,GAAG,CAAC,0BAA0B,CAAC,MAAM,IAAI,CAAC;gBAC1E,CAAC,CAAC,GAAG,CAAC,0BAA0B;gBAChC,CAAC,CAAC,IAAI;YACV,SAAS,EAAE,GAAG,CAAC,sBAAsB;SACtC;QACD,GAAG,EAAE;YACH,IAAI,EAAE,GAAG,CAAC,gBAAgB;YAC1B,IAAI,EAAE,GAAG,CAAC,gBAAgB;YAC1B,OAAO,EAAE,GAAG,CAAC,oBAAoB,IAAI,IAAI;YACzC,QAAQ,EAAE,GAAG,CAAC,oBAAoB,IAAI,IAAI;YAC1C,aAAa,EAAE,GAAG,CAAC,0BAA0B,IAAI,EAAE;YACnD,cAAc,EAAE,GAAG,CAAC,4BAA4B,IAAI,IAAI;YACxD,qBAAqB,EAAE,GAAG,CAAC,oCAAoC;SAChE;QACD,QAAQ,EAAE;YACR,QAAQ,EAAE,GAAG,CAAC,qBAAqB;YACnC,WAAW,EAAE,GAAG,CAAC,yBAAyB;YAC1C,WAAW,EAAE,GAAG,CAAC,yBAAyB;YAC1C,QAAQ,EAAE,GAAG,CAAC,qBAAqB;YACnC,aAAa,EAAE,GAAG,CAAC,2BAA2B;YAC9C,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACvB;QACD,QAAQ,EAAE;YACR,cAAc,EAAE,GAAG,CAAC,gCAAgC;YACpD,YAAY,EAAE,GAAG,CAAC,8BAA8B;SACjD;QACD,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * MCP text-content helpers + runTool envelope.
3
+ *
4
+ * Centralizes how every tool converts its result into the MCP `content` shape.
5
+ * Models read these as plain text; we prefer pretty-printed JSON with a
6
+ * short header so they're scannable in Claude Code's UI.
7
+ */
8
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
9
+ import type { ToolContext } from "../tools/context.js";
10
+ /**
11
+ * Convert anything to a JSON string with stable formatting.
12
+ */
13
+ export declare function toJson(value: unknown): string;
14
+ /**
15
+ * Build a successful text-content result. Tools use this for normal output.
16
+ */
17
+ export declare function ok(text: string): CallToolResult;
18
+ /**
19
+ * Build an error text-content result. Sets isError so the model knows.
20
+ */
21
+ export declare function errResult(text: string): CallToolResult;
22
+ /**
23
+ * Convenience: JSON result with a header line.
24
+ */
25
+ export declare function jsonResult(header: string, data: unknown): CallToolResult;
26
+ /**
27
+ * Render an array of objects as a compact text table.
28
+ * Falls back to JSON if records have varying keys.
29
+ */
30
+ export declare function tableResult(header: string, rows: Record<string, unknown>[]): CallToolResult;
31
+ /**
32
+ * Map any thrown error into a stable error result.
33
+ */
34
+ export declare function errorResult(error: unknown): CallToolResult;
35
+ /**
36
+ * Standard envelope for every tool handler. Catches errors and maps to MCP
37
+ * shape; tracks latency for logging; observes via policy gate.
38
+ */
39
+ export declare function runTool(ctx: ToolContext, name: string, args: Record<string, unknown>, fn: () => Promise<CallToolResult>): Promise<CallToolResult>;
40
+ //# sourceMappingURL=response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/format/response.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAE/C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAEtD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,cAAc,CAExE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,cAAc,CA4B3F;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAuB1D;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,EAAE,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,GAChC,OAAO,CAAC,cAAc,CAAC,CAmBzB"}
@@ -0,0 +1,109 @@
1
+ import { ZodError } from "zod";
2
+ import { ApprovalRequiredError, ProxmoxApiError } from "../proxmox/errors.js";
3
+ /**
4
+ * Convert anything to a JSON string with stable formatting.
5
+ */
6
+ export function toJson(value) {
7
+ return JSON.stringify(value, null, 2);
8
+ }
9
+ /**
10
+ * Build a successful text-content result. Tools use this for normal output.
11
+ */
12
+ export function ok(text) {
13
+ return { content: [{ type: "text", text }] };
14
+ }
15
+ /**
16
+ * Build an error text-content result. Sets isError so the model knows.
17
+ */
18
+ export function errResult(text) {
19
+ return { content: [{ type: "text", text }], isError: true };
20
+ }
21
+ /**
22
+ * Convenience: JSON result with a header line.
23
+ */
24
+ export function jsonResult(header, data) {
25
+ return ok(`${header}\n\`\`\`json\n${toJson(data)}\n\`\`\``);
26
+ }
27
+ /**
28
+ * Render an array of objects as a compact text table.
29
+ * Falls back to JSON if records have varying keys.
30
+ */
31
+ export function tableResult(header, rows) {
32
+ if (rows.length === 0) {
33
+ return ok(`${header}\n(empty)`);
34
+ }
35
+ // Collect all keys
36
+ const keys = Array.from(rows.reduce((set, r) => {
37
+ for (const k of Object.keys(r))
38
+ set.add(k);
39
+ return set;
40
+ }, new Set()));
41
+ // Pick a sensible subset if too many
42
+ const displayKeys = keys.length > 8 ? keys.slice(0, 8) : keys;
43
+ const widths = displayKeys.map((k) => Math.max(k.length, ...rows.map((r) => String(r[k] ?? "").length)));
44
+ const fmt = (cells) => cells.map((c, i) => c.padEnd(widths[i] ?? c.length)).join(" ");
45
+ const lines = [
46
+ header,
47
+ fmt(displayKeys),
48
+ fmt(widths.map((w) => "-".repeat(w))),
49
+ ...rows.map((r) => fmt(displayKeys.map((k) => String(r[k] ?? "")))),
50
+ ];
51
+ return ok(lines.join("\n"));
52
+ }
53
+ /**
54
+ * Map any thrown error into a stable error result.
55
+ */
56
+ export function errorResult(error) {
57
+ if (error instanceof ApprovalRequiredError) {
58
+ return errResult(`❌ ${error.message}\n\n` +
59
+ `Provide an 'approval_token' argument equal to PROXMOX_MCP_APPROVAL_TOKEN, ` +
60
+ `or set PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE=true in the MCP server environment.`);
61
+ }
62
+ if (error instanceof ZodError) {
63
+ return errResult(`❌ Invalid input:\n${error.issues.map((i) => ` - ${i.path.join(".") || "(root)"}: ${i.message}`).join("\n")}`);
64
+ }
65
+ if (error instanceof ProxmoxApiError) {
66
+ const detail = Object.keys(error.errors).length > 0
67
+ ? ` (${Object.entries(error.errors).map(([k, v]) => `${k}=${v}`).join(", ")})`
68
+ : "";
69
+ return errResult(`❌ Proxmox API error (${error.status})${detail}: ${error.message}`);
70
+ }
71
+ if (error instanceof Error) {
72
+ return errResult(`❌ ${error.message}`);
73
+ }
74
+ return errResult(`❌ ${String(error)}`);
75
+ }
76
+ /**
77
+ * Standard envelope for every tool handler. Catches errors and maps to MCP
78
+ * shape; tracks latency for logging; observes via policy gate.
79
+ */
80
+ export async function runTool(ctx, name, args, fn) {
81
+ const start = Date.now();
82
+ const toolLogger = ctx.logger.child({ tool: name });
83
+ try {
84
+ // Enforce policy (may throw ApprovalRequiredError)
85
+ ctx.policy.assertAllowed(name, args);
86
+ const result = await fn();
87
+ const elapsedMs = Date.now() - start;
88
+ toolLogger.info({ args: scrubArgs(args), elapsedMs, ok: true }, "tool.ok");
89
+ return result;
90
+ }
91
+ catch (error) {
92
+ const elapsedMs = Date.now() - start;
93
+ toolLogger.warn({ args: scrubArgs(args), elapsedMs, err: error instanceof Error ? error.message : String(error) }, "tool.err");
94
+ return errorResult(error);
95
+ }
96
+ }
97
+ function scrubArgs(args) {
98
+ const out = {};
99
+ for (const [k, v] of Object.entries(args)) {
100
+ if (k === "approval_token" || k === "password" || k === "new_password" || k === "cipassword") {
101
+ out[k] = "[REDACTED]";
102
+ }
103
+ else {
104
+ out[k] = v;
105
+ }
106
+ }
107
+ return out;
108
+ }
109
+ //# sourceMappingURL=response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/format/response.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,200 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Entry point. Wires env → AppConfig → McpServer → transport (stdio/sse/streamable).
4
+ *
5
+ * Transport is selected via MCP_TRANSPORT env var:
6
+ * - STDIO: default; for Claude Code integration
7
+ * - SSE: legacy HTTP+SSE
8
+ * - STREAMABLE: streamable HTTP (recommended for non-stdio clients)
9
+ *
10
+ * Use `npm run dev` for tsx watch, or `npm run build && npm start` for prod.
11
+ */
12
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
13
+ import { loadConfig, loadLoggerConfig } from "./config/index.js";
14
+ import { getLogger } from "./log.js";
15
+ import { buildServer } from "./server.js";
16
+ import { registerAll } from "./tools/index.js";
17
+ async function main() {
18
+ // Initialize logger first so we can report config errors.
19
+ const loggerCfg = loadLoggerConfig();
20
+ const logger = getLogger(loggerCfg);
21
+ let config;
22
+ try {
23
+ config = loadConfig();
24
+ }
25
+ catch (err) {
26
+ logger.fatal({ err: err instanceof Error ? err.message : String(err) }, "config.load_failed");
27
+ process.exit(2);
28
+ }
29
+ const transport = config.retryJob.jobStore === "sqlite" ? "sqlite-jobs" : "memory-jobs"; // placeholder so the line above compiles
30
+ void transport;
31
+ logger.info({
32
+ host: config.proxmox.host,
33
+ port: config.proxmox.port,
34
+ user: config.proxmox.user,
35
+ verifySsl: config.proxmox.verifySsl,
36
+ devMode: config.safety.devMode,
37
+ jobStore: config.retryJob.jobStore,
38
+ }, "proxmox-mcp.starting");
39
+ if (config.safety.dangerouslyAllowDestructive) {
40
+ logger.warn("PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE=true — destructive tools will run without approval_token");
41
+ }
42
+ if (!config.safety.approvalToken && !config.safety.dangerouslyAllowDestructive) {
43
+ logger.warn("Neither PROXMOX_MCP_APPROVAL_TOKEN nor PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE is set — destructive/high-risk tools will be rejected");
44
+ }
45
+ const { server, ctx, close } = buildServer({ config });
46
+ registerAll(server, ctx);
47
+ // Graceful shutdown
48
+ const shutdown = async (signal) => {
49
+ logger.info({ signal }, "proxmox-mcp.shutting_down");
50
+ try {
51
+ await close();
52
+ }
53
+ catch (err) {
54
+ logger.error({ err }, "proxmox-mcp.shutdown_error");
55
+ }
56
+ process.exit(0);
57
+ };
58
+ process.on("SIGINT", () => void shutdown("SIGINT"));
59
+ process.on("SIGTERM", () => void shutdown("SIGTERM"));
60
+ // Transport selection
61
+ const mode = (process.env.MCP_TRANSPORT ?? "STDIO").toUpperCase();
62
+ try {
63
+ if (mode === "STDIO") {
64
+ const transport = new StdioServerTransport();
65
+ await server.connect(transport);
66
+ logger.info("proxmox-mcp.connected_stdio");
67
+ }
68
+ else if (mode === "SSE") {
69
+ logger.warn("SSE transport falls back to streamable HTTP (legacy SSE mode not separately wired)");
70
+ await startStreamable(server, ctx, logger);
71
+ logger.info({ host: config.retryJob.httpHost, port: config.retryJob.httpPort }, "proxmox-mcp.connected_streamable");
72
+ }
73
+ else if (mode === "STREAMABLE") {
74
+ await startStreamable(server, ctx, logger);
75
+ logger.info({ host: config.retryJob.httpHost, port: config.retryJob.httpPort }, "proxmox-mcp.connected_streamable");
76
+ }
77
+ else {
78
+ throw new Error(`Unknown MCP_TRANSPORT: ${mode}`);
79
+ }
80
+ }
81
+ catch (err) {
82
+ logger.fatal({ err, mode }, "proxmox-mcp.connect_failed");
83
+ process.exit(1);
84
+ }
85
+ }
86
+ async function startStreamable(
87
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
88
+ server, _ctx, logger) {
89
+ // Dynamic import to avoid loading express/uuid when stdio mode is used
90
+ const http = await import("node:http");
91
+ const { randomUUID } = await import("node:crypto");
92
+ const { StreamableHTTPServerTransport } = await import("@modelcontextprotocol/sdk/server/streamableHttp.js");
93
+ const { isInitializeRequest } = await import("@modelcontextprotocol/sdk/types.js");
94
+ // Hard cap on incoming JSON-RPC body size. Default 1 MiB. Prevents DoS via
95
+ // a single oversized request (the body is accumulated into a Buffer below).
96
+ const MAX_BODY_BYTES = 1_048_576;
97
+ const rejectPayload = (res, code, msg) => {
98
+ res.statusCode = code;
99
+ res.setHeader("Content-Type", "text/plain; charset=utf-8");
100
+ res.end(msg);
101
+ };
102
+ const config = loadConfig();
103
+ const transport = new StreamableHTTPServerTransport({
104
+ sessionIdGenerator: () => randomUUID(),
105
+ onsessioninitialized: (sid) => {
106
+ logger.info({ sessionId: sid }, "session.initialized");
107
+ },
108
+ });
109
+ await server.connect(transport);
110
+ const httpServer = http.createServer(async (req, res) => {
111
+ if (!req.url) {
112
+ rejectPayload(res, 400, "Bad Request");
113
+ return;
114
+ }
115
+ const url = new URL(req.url, `http://${req.headers.host}`);
116
+ if (url.pathname === "/health") {
117
+ res.setHeader("Content-Type", "application/json");
118
+ res.end(JSON.stringify({ status: "ok", service: "proxmox-mcp" }));
119
+ return;
120
+ }
121
+ if (url.pathname === "/mcp") {
122
+ // DELETE /mcp — close the session and tear down the transport.
123
+ if (req.method === "DELETE") {
124
+ await transport.close();
125
+ res.statusCode = 200;
126
+ res.end();
127
+ return;
128
+ }
129
+ // GET /mcp is reserved by the SDK (SSE stream); pass through.
130
+ if (req.method === "GET") {
131
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
132
+ const handleReq = transport.handleRequest.bind(transport);
133
+ await handleReq(req, res, undefined);
134
+ return;
135
+ }
136
+ // POST /mcp — the only path that carries a JSON-RPC body.
137
+ if (req.method !== "POST") {
138
+ rejectPayload(res, 405, "Method Not Allowed");
139
+ return;
140
+ }
141
+ // Enforce Content-Type: application/json (and any charset suffix).
142
+ const ct = (req.headers["content-type"] ?? "").toLowerCase();
143
+ if (!ct.startsWith("application/json")) {
144
+ rejectPayload(res, 415, "Content-Type must be application/json");
145
+ return;
146
+ }
147
+ // Reject upfront if Content-Length is already over the cap.
148
+ const declared = Number.parseInt(req.headers["content-length"] ?? "", 10);
149
+ if (Number.isFinite(declared) && declared > MAX_BODY_BYTES) {
150
+ rejectPayload(res, 413, "Payload Too Large");
151
+ return;
152
+ }
153
+ // Accumulate body, abort if it grows past the cap during streaming.
154
+ const chunks = [];
155
+ let total = 0;
156
+ let aborted = false;
157
+ try {
158
+ for await (const chunk of req) {
159
+ const buf = chunk;
160
+ total += buf.length;
161
+ if (total > MAX_BODY_BYTES) {
162
+ aborted = true;
163
+ break;
164
+ }
165
+ chunks.push(buf);
166
+ }
167
+ }
168
+ catch {
169
+ // socket error; nothing to do — response will be aborted by Node
170
+ }
171
+ if (aborted) {
172
+ rejectPayload(res, 413, "Payload Too Large");
173
+ return;
174
+ }
175
+ const body = Buffer.concat(chunks).toString("utf8");
176
+ let parsed;
177
+ try {
178
+ parsed = body ? JSON.parse(body) : undefined;
179
+ }
180
+ catch {
181
+ rejectPayload(res, 400, "Invalid JSON");
182
+ return;
183
+ }
184
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
185
+ const handleReq = transport.handleRequest.bind(transport);
186
+ await handleReq(req, res, parsed);
187
+ return;
188
+ }
189
+ rejectPayload(res, 404, "Not Found");
190
+ });
191
+ void isInitializeRequest; // silence unused
192
+ await new Promise((resolve) => httpServer.listen(config.retryJob.httpPort, config.retryJob.httpHost, resolve));
193
+ logger.info({ host: config.retryJob.httpHost, port: config.retryJob.httpPort }, "proxmox-mcp.http_listening");
194
+ return httpServer;
195
+ }
196
+ main().catch((err) => {
197
+ process.stderr.write(`[FATAL] ${err instanceof Error ? err.message : String(err)}\n`);
198
+ process.exit(1);
199
+ });
200
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,KAAK,UAAU,IAAI;IACjB,0DAA0D;IAC1D,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAEpC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,UAAU,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;QAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,yCAAyC;IAClI,KAAK,SAAS,CAAC;IAEf,MAAM,CAAC,IAAI,CACT;QACE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI;QACzB,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI;QACzB,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI;QACzB,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS;QACnC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;QAC9B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;KACnC,EACD,sBAAsB,CACvB,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,CAAC,2BAA2B,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CACT,gGAAgG,CACjG,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,2BAA2B,EAAE,CAAC;QAC/E,MAAM,CAAC,IAAI,CACT,oIAAoI,CACrI,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvD,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEzB,oBAAoB;IACpB,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;QACvD,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,2BAA2B,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,KAAK,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,4BAA4B,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAEtD,sBAAsB;IACtB,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAClE,IAAI,CAAC;QACH,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;YAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,oFAAoF,CAAC,CAAC;YAClG,MAAM,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,kCAAkC,CAAC,CAAC;QACtH,CAAC;aAAM,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YACjC,MAAM,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,kCAAkC,CAAC,CAAC;QACtH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,4BAA4B,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe;AAC5B,8DAA8D;AAC9D,MAAW,EACX,IAAa,EACb,MAAoC;IAEpC,uEAAuE;IACvE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,EAAE,6BAA6B,EAAE,GAAG,MAAM,MAAM,CACpD,oDAAoD,CACrD,CAAC;IACF,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAC;IAEnF,2EAA2E;IAC3E,4EAA4E;IAC5E,MAAM,cAAc,GAAG,SAAS,CAAC;IACjC,MAAM,aAAa,GAAG,CAAC,GAAuC,EAAE,IAAY,EAAE,GAAW,EAAQ,EAAE;QACjG,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;QACtB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;QAClD,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;QACtC,oBAAoB,EAAE,CAAC,GAAW,EAAE,EAAE;YACpC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,qBAAqB,CAAC,CAAC;QACzD,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACb,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAE3D,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC/B,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAClD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC5B,+DAA+D;YAC/D,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;gBACxB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YAED,8DAA8D;YAC9D,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBACzB,8DAA8D;gBAC9D,MAAM,SAAS,GAAI,SAAyG,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC3J,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,0DAA0D;YAC1D,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC1B,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC;gBAC9C,OAAO;YACT,CAAC;YAED,mEAAmE;YACnE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACvC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,uCAAuC,CAAC,CAAC;gBACjE,OAAO;YACT,CAAC;YAED,4DAA4D;YAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1E,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,cAAc,EAAE,CAAC;gBAC3D,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;YAED,oEAAoE;YACpE,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC;gBACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;oBAC9B,MAAM,GAAG,GAAG,KAAe,CAAC;oBAC5B,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC;oBACpB,IAAI,KAAK,GAAG,cAAc,EAAE,CAAC;wBAC3B,OAAO,GAAG,IAAI,CAAC;wBACf,MAAM;oBACR,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,iEAAiE;YACnE,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACZ,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACpD,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACP,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;gBACxC,OAAO;YACT,CAAC;YACD,8DAA8D;YAC9D,MAAM,SAAS,GAAI,SAAyG,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3J,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,KAAK,mBAAmB,CAAC,CAAC,iBAAiB;IAE3C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAC/E,CAAC;IACF,MAAM,CAAC,IAAI,CACT,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAClE,4BAA4B,CAC7B,CAAC;IACF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,34 @@
1
+ import type { Logger } from "../log.js";
2
+ import type { CreateJobOpts, JobRecord, JobStatus, JobStore } from "./store.js";
3
+ export interface SqliteJobStoreOptions {
4
+ sqlitePath: string;
5
+ ttlHours: number;
6
+ logger?: Logger;
7
+ }
8
+ export declare class SqliteJobStore implements JobStore {
9
+ private readonly db;
10
+ private readonly ttlMs;
11
+ private readonly logger;
12
+ private readonly stmtInsert;
13
+ private readonly stmtGet;
14
+ private readonly stmtList;
15
+ private readonly stmtUpdate;
16
+ private readonly stmtDelete;
17
+ private readonly stmtEvict;
18
+ private readonly stmtSetUpid;
19
+ constructor(opts: SqliteJobStoreOptions);
20
+ create(opts: CreateJobOpts): JobRecord;
21
+ get(jobId: string): JobRecord | null;
22
+ list(filter?: {
23
+ status?: JobStatus;
24
+ tool?: string;
25
+ limit?: number;
26
+ }): JobRecord[];
27
+ setUpid(jobId: string, upid: string): void;
28
+ update(jobId: string, patch: Partial<JobRecord>): void;
29
+ delete(jobId: string): boolean;
30
+ evictExpired(): number;
31
+ close(): void;
32
+ private migrate;
33
+ }
34
+ //# sourceMappingURL=sqlite-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-store.d.ts","sourceRoot":"","sources":["../../src/jobs/sqlite-store.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEhF,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA6BD,qBAAa,cAAe,YAAW,QAAQ;IAC7C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAiB;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAG5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;IACnD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IACrD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IACrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;gBAE1C,IAAI,EAAE,qBAAqB;IAgEvC,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS;IAoCtC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAKpC,IAAI,CAAC,MAAM,GAAE;QAAE,MAAM,CAAC,EAAE,SAAS,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,SAAS,EAAE;IASrF,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAY1C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;IAqBtD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAK9B,YAAY,IAAI,MAAM;IAStB,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,OAAO;CAqBhB"}