synapse-mcp 1.0.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 (138) hide show
  1. package/README.md +607 -0
  2. package/dist/constants.d.ts +23 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/constants.js +58 -0
  5. package/dist/constants.js.map +1 -0
  6. package/dist/formatters/index.d.ts +275 -0
  7. package/dist/formatters/index.d.ts.map +1 -0
  8. package/dist/formatters/index.js +461 -0
  9. package/dist/formatters/index.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +178 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/schemas/common.d.ts +48 -0
  15. package/dist/schemas/common.d.ts.map +1 -0
  16. package/dist/schemas/common.js +69 -0
  17. package/dist/schemas/common.js.map +1 -0
  18. package/dist/schemas/discriminator.d.ts +20 -0
  19. package/dist/schemas/discriminator.d.ts.map +1 -0
  20. package/dist/schemas/discriminator.js +25 -0
  21. package/dist/schemas/discriminator.js.map +1 -0
  22. package/dist/schemas/flux/compose.d.ts +93 -0
  23. package/dist/schemas/flux/compose.d.ts.map +1 -0
  24. package/dist/schemas/flux/compose.js +112 -0
  25. package/dist/schemas/flux/compose.js.map +1 -0
  26. package/dist/schemas/flux/container.d.ts +144 -0
  27. package/dist/schemas/flux/container.d.ts.map +1 -0
  28. package/dist/schemas/flux/container.js +163 -0
  29. package/dist/schemas/flux/container.js.map +1 -0
  30. package/dist/schemas/flux/docker.d.ts +91 -0
  31. package/dist/schemas/flux/docker.d.ts.map +1 -0
  32. package/dist/schemas/flux/docker.js +101 -0
  33. package/dist/schemas/flux/docker.js.map +1 -0
  34. package/dist/schemas/flux/host.d.ts +61 -0
  35. package/dist/schemas/flux/host.d.ts.map +1 -0
  36. package/dist/schemas/flux/host.js +72 -0
  37. package/dist/schemas/flux/host.js.map +1 -0
  38. package/dist/schemas/flux/index.d.ts +20 -0
  39. package/dist/schemas/flux/index.d.ts.map +1 -0
  40. package/dist/schemas/flux/index.js +88 -0
  41. package/dist/schemas/flux/index.js.map +1 -0
  42. package/dist/schemas/index.d.ts +11 -0
  43. package/dist/schemas/index.d.ts.map +1 -0
  44. package/dist/schemas/index.js +11 -0
  45. package/dist/schemas/index.js.map +1 -0
  46. package/dist/schemas/scout/index.d.ts +151 -0
  47. package/dist/schemas/scout/index.d.ts.map +1 -0
  48. package/dist/schemas/scout/index.js +41 -0
  49. package/dist/schemas/scout/index.js.map +1 -0
  50. package/dist/schemas/scout/logs.d.ts +48 -0
  51. package/dist/schemas/scout/logs.d.ts.map +1 -0
  52. package/dist/schemas/scout/logs.js +47 -0
  53. package/dist/schemas/scout/logs.js.map +1 -0
  54. package/dist/schemas/scout/simple.d.ts +68 -0
  55. package/dist/schemas/scout/simple.d.ts.map +1 -0
  56. package/dist/schemas/scout/simple.js +75 -0
  57. package/dist/schemas/scout/simple.js.map +1 -0
  58. package/dist/schemas/scout/zfs.d.ts +37 -0
  59. package/dist/schemas/scout/zfs.d.ts.map +1 -0
  60. package/dist/schemas/scout/zfs.js +36 -0
  61. package/dist/schemas/scout/zfs.js.map +1 -0
  62. package/dist/schemas/unified.d.ts +674 -0
  63. package/dist/schemas/unified.d.ts.map +1 -0
  64. package/dist/schemas/unified.js +453 -0
  65. package/dist/schemas/unified.js.map +1 -0
  66. package/dist/services/compose.d.ts +107 -0
  67. package/dist/services/compose.d.ts.map +1 -0
  68. package/dist/services/compose.js +308 -0
  69. package/dist/services/compose.js.map +1 -0
  70. package/dist/services/container.d.ts +69 -0
  71. package/dist/services/container.d.ts.map +1 -0
  72. package/dist/services/container.js +111 -0
  73. package/dist/services/container.js.map +1 -0
  74. package/dist/services/docker.d.ts +243 -0
  75. package/dist/services/docker.d.ts.map +1 -0
  76. package/dist/services/docker.js +812 -0
  77. package/dist/services/docker.js.map +1 -0
  78. package/dist/services/file-service.d.ts +79 -0
  79. package/dist/services/file-service.d.ts.map +1 -0
  80. package/dist/services/file-service.js +226 -0
  81. package/dist/services/file-service.js.map +1 -0
  82. package/dist/services/interfaces.d.ts +537 -0
  83. package/dist/services/interfaces.d.ts.map +1 -0
  84. package/dist/services/interfaces.js +2 -0
  85. package/dist/services/interfaces.js.map +1 -0
  86. package/dist/services/ssh-pool-exec.d.ts +10 -0
  87. package/dist/services/ssh-pool-exec.d.ts.map +1 -0
  88. package/dist/services/ssh-pool-exec.js +10 -0
  89. package/dist/services/ssh-pool-exec.js.map +1 -0
  90. package/dist/services/ssh-pool.d.ts +66 -0
  91. package/dist/services/ssh-pool.d.ts.map +1 -0
  92. package/dist/services/ssh-pool.js +253 -0
  93. package/dist/services/ssh-pool.js.map +1 -0
  94. package/dist/services/ssh-service.d.ts +39 -0
  95. package/dist/services/ssh-service.d.ts.map +1 -0
  96. package/dist/services/ssh-service.js +143 -0
  97. package/dist/services/ssh-service.js.map +1 -0
  98. package/dist/services/ssh.d.ts +37 -0
  99. package/dist/services/ssh.d.ts.map +1 -0
  100. package/dist/services/ssh.js +50 -0
  101. package/dist/services/ssh.js.map +1 -0
  102. package/dist/tools/flux.d.ts +14 -0
  103. package/dist/tools/flux.d.ts.map +1 -0
  104. package/dist/tools/flux.js +86 -0
  105. package/dist/tools/flux.js.map +1 -0
  106. package/dist/tools/index.d.ts +7 -0
  107. package/dist/tools/index.d.ts.map +1 -0
  108. package/dist/tools/index.js +43 -0
  109. package/dist/tools/index.js.map +1 -0
  110. package/dist/tools/scout.d.ts +14 -0
  111. package/dist/tools/scout.d.ts.map +1 -0
  112. package/dist/tools/scout.js +96 -0
  113. package/dist/tools/scout.js.map +1 -0
  114. package/dist/tools/unified.d.ts +7 -0
  115. package/dist/tools/unified.d.ts.map +1 -0
  116. package/dist/tools/unified.js +827 -0
  117. package/dist/tools/unified.js.map +1 -0
  118. package/dist/types.d.ts +93 -0
  119. package/dist/types.d.ts.map +1 -0
  120. package/dist/types.js +7 -0
  121. package/dist/types.js.map +1 -0
  122. package/dist/utils/errors.d.ts +60 -0
  123. package/dist/utils/errors.d.ts.map +1 -0
  124. package/dist/utils/errors.js +131 -0
  125. package/dist/utils/errors.js.map +1 -0
  126. package/dist/utils/help.d.ts +69 -0
  127. package/dist/utils/help.d.ts.map +1 -0
  128. package/dist/utils/help.js +259 -0
  129. package/dist/utils/help.js.map +1 -0
  130. package/dist/utils/index.d.ts +4 -0
  131. package/dist/utils/index.d.ts.map +1 -0
  132. package/dist/utils/index.js +4 -0
  133. package/dist/utils/index.js.map +1 -0
  134. package/dist/utils/path-security.d.ts +64 -0
  135. package/dist/utils/path-security.d.ts.map +1 -0
  136. package/dist/utils/path-security.js +138 -0
  137. package/dist/utils/path-security.js.map +1 -0
  138. package/package.json +85 -0
@@ -0,0 +1,308 @@
1
+ import { validateHostForSsh } from "./ssh.js";
2
+ import { ComposeOperationError, logError } from "../utils/errors.js";
3
+ /**
4
+ * Validate Docker Compose project name
5
+ * Project names must be alphanumeric with hyphens and underscores only
6
+ */
7
+ export function validateProjectName(name) {
8
+ if (!name || !/^[a-zA-Z0-9_-]+$/.test(name)) {
9
+ throw new Error(`Invalid project name: ${name}`);
10
+ }
11
+ }
12
+ /**
13
+ * Validate extra arguments for docker compose commands
14
+ *
15
+ * SECURITY: Prevents command injection by rejecting shell metacharacters.
16
+ * Only allows alphanumeric, hyphens, underscores, dots, equals, colons,
17
+ * forward slashes, commas, and spaces.
18
+ *
19
+ * @throws {Error} If argument contains shell metacharacters or exceeds 500 chars
20
+ */
21
+ function validateComposeArgs(args) {
22
+ const SHELL_METACHARACTERS = /[;&|`$()<>{}[\]\\"\n\r\t]/;
23
+ for (const arg of args) {
24
+ if (SHELL_METACHARACTERS.test(arg)) {
25
+ throw new Error(`Invalid character in compose argument: ${arg}`);
26
+ }
27
+ // Additional safety: reject extremely long arguments (DoS prevention)
28
+ if (arg.length > 500) {
29
+ throw new Error(`Compose argument too long: ${arg.substring(0, 50)}...`);
30
+ }
31
+ }
32
+ }
33
+ /**
34
+ * Build docker compose command string for remote execution
35
+ *
36
+ * @param project - Project name (optional, for commands that need -p flag)
37
+ * @param action - Compose action (up, down, ps, ls, etc.)
38
+ * @param extraArgs - Additional arguments
39
+ * @returns Command string
40
+ */
41
+ function buildComposeCommand(project, action, extraArgs = []) {
42
+ const parts = ["docker", "compose"];
43
+ if (project) {
44
+ parts.push("-p", project);
45
+ }
46
+ parts.push(action);
47
+ parts.push(...extraArgs);
48
+ return parts.join(" ");
49
+ }
50
+ /**
51
+ * Parse compose status string to enum
52
+ */
53
+ function parseComposeStatus(status) {
54
+ const lower = status.toLowerCase();
55
+ if (lower.includes("running")) {
56
+ if (lower.includes("(") && !lower.includes("running(")) {
57
+ return "partial";
58
+ }
59
+ return "running";
60
+ }
61
+ if (lower.includes("exited") || lower.includes("stopped")) {
62
+ return "stopped";
63
+ }
64
+ return "unknown";
65
+ }
66
+ /**
67
+ * ComposeService class for managing Docker Compose operations with dependency injection
68
+ */
69
+ export class ComposeService {
70
+ sshService;
71
+ constructor(sshService) {
72
+ this.sshService = sshService;
73
+ }
74
+ /**
75
+ * Execute docker compose command on remote host using connection pool
76
+ *
77
+ * SECURITY: Arguments are validated before execution to prevent command injection.
78
+ * Uses SSH connection pool for better performance.
79
+ *
80
+ * @param host - Host configuration with SSH details
81
+ * @param project - Docker Compose project name (validated, alphanumeric only)
82
+ * @param action - Compose action (up, down, restart, etc.)
83
+ * @param extraArgs - Additional arguments (validated for shell metacharacters)
84
+ * @returns Command output
85
+ * @throws {Error} If validation fails or SSH execution fails
86
+ */
87
+ async composeExec(host, project, action, extraArgs = []) {
88
+ validateHostForSsh(host);
89
+ validateProjectName(project);
90
+ validateComposeArgs(extraArgs);
91
+ const command = buildComposeCommand(project, action, extraArgs);
92
+ try {
93
+ return await this.sshService.executeSSHCommand(host, command, [], { timeoutMs: 30000 });
94
+ }
95
+ catch (error) {
96
+ const detail = error instanceof Error ? error.message : "Unknown error";
97
+ throw new ComposeOperationError(`Docker Compose command failed: ${detail}`, host.name, project, action, error);
98
+ }
99
+ }
100
+ /**
101
+ * List all compose projects on a host using connection pool
102
+ */
103
+ async listComposeProjects(host) {
104
+ validateHostForSsh(host);
105
+ const command = buildComposeCommand(null, "ls", ["--format", "json"]);
106
+ try {
107
+ const stdout = await this.sshService.executeSSHCommand(host, command, [], {
108
+ timeoutMs: 15000
109
+ });
110
+ if (!stdout.trim()) {
111
+ return [];
112
+ }
113
+ const projects = JSON.parse(stdout);
114
+ return projects.map((p) => ({
115
+ name: p.Name,
116
+ status: parseComposeStatus(p.Status),
117
+ configFiles: p.ConfigFiles.split(",").map((f) => f.trim()),
118
+ services: []
119
+ }));
120
+ }
121
+ catch (error) {
122
+ const detail = error instanceof Error ? error.message : "Unknown error";
123
+ throw new ComposeOperationError(`Failed to list compose projects: ${detail}`, host.name, "*", "ls", error);
124
+ }
125
+ }
126
+ /**
127
+ * Get detailed status of a compose project using connection pool
128
+ */
129
+ async getComposeStatus(host, project) {
130
+ validateHostForSsh(host);
131
+ validateProjectName(project);
132
+ const command = buildComposeCommand(project, "ps", ["--format", "json"]);
133
+ try {
134
+ const stdout = await this.sshService.executeSSHCommand(host, command, [], {
135
+ timeoutMs: 15000
136
+ });
137
+ const services = [];
138
+ if (stdout.trim()) {
139
+ // docker compose ps outputs one JSON object per line
140
+ const lines = stdout.trim().split("\n");
141
+ for (const line of lines) {
142
+ if (!line.trim())
143
+ continue;
144
+ try {
145
+ const svc = JSON.parse(line);
146
+ services.push({
147
+ name: svc.Name,
148
+ status: svc.State,
149
+ health: svc.Health,
150
+ exitCode: svc.ExitCode,
151
+ publishers: svc.Publishers?.map((p) => ({
152
+ publishedPort: p.PublishedPort,
153
+ targetPort: p.TargetPort,
154
+ protocol: p.Protocol
155
+ }))
156
+ });
157
+ }
158
+ catch {
159
+ logError(new Error("Failed to parse compose service line"), {
160
+ operation: "getComposeStatus",
161
+ metadata: {
162
+ host: host.name,
163
+ project,
164
+ line: line.substring(0, 100)
165
+ }
166
+ });
167
+ }
168
+ }
169
+ }
170
+ // Determine overall status
171
+ let status = "unknown";
172
+ if (services.length === 0) {
173
+ status = "stopped";
174
+ }
175
+ else {
176
+ const running = services.filter((s) => s.status === "running").length;
177
+ if (running === services.length) {
178
+ status = "running";
179
+ }
180
+ else if (running > 0) {
181
+ status = "partial";
182
+ }
183
+ else {
184
+ status = "stopped";
185
+ }
186
+ }
187
+ return {
188
+ name: project,
189
+ status,
190
+ configFiles: [],
191
+ services
192
+ };
193
+ }
194
+ catch (error) {
195
+ const detail = error instanceof Error ? error.message : "Unknown error";
196
+ throw new ComposeOperationError(`Failed to get compose status: ${detail}`, host.name, project, "ps", error);
197
+ }
198
+ }
199
+ /**
200
+ * Start a compose project
201
+ */
202
+ async composeUp(host, project, detach = true) {
203
+ const args = detach ? ["-d"] : [];
204
+ return this.composeExec(host, project, "up", args);
205
+ }
206
+ /**
207
+ * Stop a compose project
208
+ */
209
+ async composeDown(host, project, removeVolumes = false) {
210
+ const args = removeVolumes ? ["-v"] : [];
211
+ return this.composeExec(host, project, "down", args);
212
+ }
213
+ /**
214
+ * Restart a compose project
215
+ */
216
+ async composeRestart(host, project) {
217
+ return this.composeExec(host, project, "restart", []);
218
+ }
219
+ /**
220
+ * Get logs from a compose project
221
+ */
222
+ async composeLogs(host, project, options = {}) {
223
+ const args = ["--no-color"];
224
+ if (options.tail !== undefined) {
225
+ args.push("--tail", String(options.tail));
226
+ }
227
+ if (options.follow) {
228
+ args.push("-f");
229
+ }
230
+ if (options.timestamps) {
231
+ args.push("-t");
232
+ }
233
+ if (options.since) {
234
+ args.push("--since", options.since);
235
+ }
236
+ if (options.until) {
237
+ args.push("--until", options.until);
238
+ }
239
+ if (options.services && options.services.length > 0) {
240
+ // Validate service names
241
+ for (const service of options.services) {
242
+ if (!/^[a-zA-Z0-9_-]+$/.test(service)) {
243
+ throw new Error(`Invalid service name: ${service}`);
244
+ }
245
+ }
246
+ args.push(...options.services);
247
+ }
248
+ return this.composeExec(host, project, "logs", args);
249
+ }
250
+ /**
251
+ * Build images for a compose project
252
+ */
253
+ async composeBuild(host, project, options = {}) {
254
+ const args = [];
255
+ if (options.noCache) {
256
+ args.push("--no-cache");
257
+ }
258
+ if (options.pull) {
259
+ args.push("--pull");
260
+ }
261
+ if (options.service) {
262
+ if (!/^[a-zA-Z0-9_-]+$/.test(options.service)) {
263
+ throw new Error(`Invalid service name: ${options.service}`);
264
+ }
265
+ args.push(options.service);
266
+ }
267
+ return this.composeExec(host, project, "build", args);
268
+ }
269
+ /**
270
+ * Pull images for a compose project
271
+ */
272
+ async composePull(host, project, options = {}) {
273
+ const args = [];
274
+ if (options.ignorePullFailures) {
275
+ args.push("--ignore-pull-failures");
276
+ }
277
+ if (options.quiet) {
278
+ args.push("--quiet");
279
+ }
280
+ if (options.service) {
281
+ if (!/^[a-zA-Z0-9_-]+$/.test(options.service)) {
282
+ throw new Error(`Invalid service name: ${options.service}`);
283
+ }
284
+ args.push(options.service);
285
+ }
286
+ return this.composeExec(host, project, "pull", args);
287
+ }
288
+ /**
289
+ * Recreate containers for a compose project (force recreate)
290
+ */
291
+ async composeRecreate(host, project, options = {}) {
292
+ const args = ["-d"];
293
+ if (options.forceRecreate !== false) {
294
+ args.push("--force-recreate");
295
+ }
296
+ if (options.noDeps) {
297
+ args.push("--no-deps");
298
+ }
299
+ if (options.service) {
300
+ if (!/^[a-zA-Z0-9_-]+$/.test(options.service)) {
301
+ throw new Error(`Invalid service name: ${options.service}`);
302
+ }
303
+ args.push(options.service);
304
+ }
305
+ return this.composeExec(host, project, "up", args);
306
+ }
307
+ }
308
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/services/compose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { IDockerService, ISSHService, IComposeService, ISSHConnectionPool, IFileService } from "./interfaces.js";
2
+ /**
3
+ * Service container for dependency injection.
4
+ * Manages service lifecycle and dependencies.
5
+ *
6
+ * Dependency chain:
7
+ * - SSHConnectionPool (no dependencies)
8
+ * - SSHService (requires SSHConnectionPool)
9
+ * - ComposeService (requires SSHService)
10
+ * - FileService (requires SSHService)
11
+ * - DockerService (no dependencies)
12
+ */
13
+ export declare class ServiceContainer {
14
+ private dockerService?;
15
+ private sshService?;
16
+ private composeService?;
17
+ private sshPool?;
18
+ private fileService?;
19
+ /**
20
+ * Get Docker service instance (lazy initialization)
21
+ */
22
+ getDockerService(): IDockerService;
23
+ /**
24
+ * Set Docker service instance (for testing/overrides)
25
+ */
26
+ setDockerService(service: IDockerService): void;
27
+ /**
28
+ * Get SSH connection pool instance (lazy initialization)
29
+ */
30
+ getSSHConnectionPool(): ISSHConnectionPool;
31
+ /**
32
+ * Set SSH connection pool instance (for testing/overrides)
33
+ */
34
+ setSSHConnectionPool(pool: ISSHConnectionPool): void;
35
+ /**
36
+ * Get SSH service instance (lazy initialization with dependencies)
37
+ */
38
+ getSSHService(): ISSHService;
39
+ /**
40
+ * Set SSH service instance (for testing/overrides)
41
+ */
42
+ setSSHService(service: ISSHService): void;
43
+ /**
44
+ * Get Compose service instance (lazy initialization with dependencies)
45
+ */
46
+ getComposeService(): IComposeService;
47
+ /**
48
+ * Set Compose service instance (for testing/overrides)
49
+ */
50
+ setComposeService(service: IComposeService): void;
51
+ /**
52
+ * Get File service instance (lazy initialization with dependencies)
53
+ */
54
+ getFileService(): IFileService;
55
+ /**
56
+ * Set File service instance (for testing/overrides)
57
+ */
58
+ setFileService(service: IFileService): void;
59
+ /**
60
+ * Cleanup all services and close connections.
61
+ * Call during shutdown to ensure clean termination.
62
+ */
63
+ cleanup(): Promise<void>;
64
+ }
65
+ /**
66
+ * Create a default service container with lazy initialization
67
+ */
68
+ export declare function createDefaultContainer(): ServiceContainer;
69
+ //# sourceMappingURL=container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/services/container.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,YAAY,EACb,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;;;;GAUG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,aAAa,CAAC,CAAiB;IACvC,OAAO,CAAC,UAAU,CAAC,CAAc;IACjC,OAAO,CAAC,cAAc,CAAC,CAAkB;IACzC,OAAO,CAAC,OAAO,CAAC,CAAqB;IACrC,OAAO,CAAC,WAAW,CAAC,CAAe;IAEnC;;OAEG;IACH,gBAAgB,IAAI,cAAc;IAKlC;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAI/C;;OAEG;IACH,oBAAoB,IAAI,kBAAkB;IAK1C;;OAEG;IACH,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI;IAIpD;;OAEG;IACH,aAAa,IAAI,WAAW;IAK5B;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAIzC;;OAEG;IACH,iBAAiB,IAAI,eAAe;IAKpC;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAIjD;;OAEG;IACH,cAAc,IAAI,YAAY;IAK9B;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAI3C;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAM/B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD"}
@@ -0,0 +1,111 @@
1
+ import { DockerService } from "./docker.js";
2
+ import { SSHConnectionPoolImpl } from "./ssh-pool.js";
3
+ import { SSHService } from "./ssh-service.js";
4
+ import { ComposeService } from "./compose.js";
5
+ import { FileService } from "./file-service.js";
6
+ /**
7
+ * Service container for dependency injection.
8
+ * Manages service lifecycle and dependencies.
9
+ *
10
+ * Dependency chain:
11
+ * - SSHConnectionPool (no dependencies)
12
+ * - SSHService (requires SSHConnectionPool)
13
+ * - ComposeService (requires SSHService)
14
+ * - FileService (requires SSHService)
15
+ * - DockerService (no dependencies)
16
+ */
17
+ export class ServiceContainer {
18
+ dockerService;
19
+ sshService;
20
+ composeService;
21
+ sshPool;
22
+ fileService;
23
+ /**
24
+ * Get Docker service instance (lazy initialization)
25
+ */
26
+ getDockerService() {
27
+ if (!this.dockerService)
28
+ this.dockerService = new DockerService();
29
+ return this.dockerService;
30
+ }
31
+ /**
32
+ * Set Docker service instance (for testing/overrides)
33
+ */
34
+ setDockerService(service) {
35
+ this.dockerService = service;
36
+ }
37
+ /**
38
+ * Get SSH connection pool instance (lazy initialization)
39
+ */
40
+ getSSHConnectionPool() {
41
+ if (!this.sshPool)
42
+ this.sshPool = new SSHConnectionPoolImpl();
43
+ return this.sshPool;
44
+ }
45
+ /**
46
+ * Set SSH connection pool instance (for testing/overrides)
47
+ */
48
+ setSSHConnectionPool(pool) {
49
+ this.sshPool = pool;
50
+ }
51
+ /**
52
+ * Get SSH service instance (lazy initialization with dependencies)
53
+ */
54
+ getSSHService() {
55
+ if (!this.sshService)
56
+ this.sshService = new SSHService(this.getSSHConnectionPool());
57
+ return this.sshService;
58
+ }
59
+ /**
60
+ * Set SSH service instance (for testing/overrides)
61
+ */
62
+ setSSHService(service) {
63
+ this.sshService = service;
64
+ }
65
+ /**
66
+ * Get Compose service instance (lazy initialization with dependencies)
67
+ */
68
+ getComposeService() {
69
+ if (!this.composeService)
70
+ this.composeService = new ComposeService(this.getSSHService());
71
+ return this.composeService;
72
+ }
73
+ /**
74
+ * Set Compose service instance (for testing/overrides)
75
+ */
76
+ setComposeService(service) {
77
+ this.composeService = service;
78
+ }
79
+ /**
80
+ * Get File service instance (lazy initialization with dependencies)
81
+ */
82
+ getFileService() {
83
+ if (!this.fileService)
84
+ this.fileService = new FileService(this.getSSHService());
85
+ return this.fileService;
86
+ }
87
+ /**
88
+ * Set File service instance (for testing/overrides)
89
+ */
90
+ setFileService(service) {
91
+ this.fileService = service;
92
+ }
93
+ /**
94
+ * Cleanup all services and close connections.
95
+ * Call during shutdown to ensure clean termination.
96
+ */
97
+ async cleanup() {
98
+ if (this.sshPool)
99
+ await this.sshPool.closeAll();
100
+ if (this.dockerService) {
101
+ this.dockerService.clearClients();
102
+ }
103
+ }
104
+ }
105
+ /**
106
+ * Create a default service container with lazy initialization
107
+ */
108
+ export function createDefaultContainer() {
109
+ return new ServiceContainer();
110
+ }
111
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/services/container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAShD;;;;;;;;;;GAUG;AACH,MAAM,OAAO,gBAAgB;IACnB,aAAa,CAAkB;IAC/B,UAAU,CAAe;IACzB,cAAc,CAAmB;IACjC,OAAO,CAAsB;IAC7B,WAAW,CAAgB;IAEnC;;OAEG;IACH,gBAAgB;QACd,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;QAClE,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,OAAuB;QACtC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,IAAI,qBAAqB,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,IAAwB;QAC3C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,OAAoB;QAChC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QACzF,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,OAAwB;QACxC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,OAAqB;QAClC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAChD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,gBAAgB,EAAE,CAAC;AAChC,CAAC"}