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.
- package/README.md +607 -0
- package/dist/constants.d.ts +23 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +58 -0
- package/dist/constants.js.map +1 -0
- package/dist/formatters/index.d.ts +275 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +461 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +178 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/common.d.ts +48 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +69 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/discriminator.d.ts +20 -0
- package/dist/schemas/discriminator.d.ts.map +1 -0
- package/dist/schemas/discriminator.js +25 -0
- package/dist/schemas/discriminator.js.map +1 -0
- package/dist/schemas/flux/compose.d.ts +93 -0
- package/dist/schemas/flux/compose.d.ts.map +1 -0
- package/dist/schemas/flux/compose.js +112 -0
- package/dist/schemas/flux/compose.js.map +1 -0
- package/dist/schemas/flux/container.d.ts +144 -0
- package/dist/schemas/flux/container.d.ts.map +1 -0
- package/dist/schemas/flux/container.js +163 -0
- package/dist/schemas/flux/container.js.map +1 -0
- package/dist/schemas/flux/docker.d.ts +91 -0
- package/dist/schemas/flux/docker.d.ts.map +1 -0
- package/dist/schemas/flux/docker.js +101 -0
- package/dist/schemas/flux/docker.js.map +1 -0
- package/dist/schemas/flux/host.d.ts +61 -0
- package/dist/schemas/flux/host.d.ts.map +1 -0
- package/dist/schemas/flux/host.js +72 -0
- package/dist/schemas/flux/host.js.map +1 -0
- package/dist/schemas/flux/index.d.ts +20 -0
- package/dist/schemas/flux/index.d.ts.map +1 -0
- package/dist/schemas/flux/index.js +88 -0
- package/dist/schemas/flux/index.js.map +1 -0
- package/dist/schemas/index.d.ts +11 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +11 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/scout/index.d.ts +151 -0
- package/dist/schemas/scout/index.d.ts.map +1 -0
- package/dist/schemas/scout/index.js +41 -0
- package/dist/schemas/scout/index.js.map +1 -0
- package/dist/schemas/scout/logs.d.ts +48 -0
- package/dist/schemas/scout/logs.d.ts.map +1 -0
- package/dist/schemas/scout/logs.js +47 -0
- package/dist/schemas/scout/logs.js.map +1 -0
- package/dist/schemas/scout/simple.d.ts +68 -0
- package/dist/schemas/scout/simple.d.ts.map +1 -0
- package/dist/schemas/scout/simple.js +75 -0
- package/dist/schemas/scout/simple.js.map +1 -0
- package/dist/schemas/scout/zfs.d.ts +37 -0
- package/dist/schemas/scout/zfs.d.ts.map +1 -0
- package/dist/schemas/scout/zfs.js +36 -0
- package/dist/schemas/scout/zfs.js.map +1 -0
- package/dist/schemas/unified.d.ts +674 -0
- package/dist/schemas/unified.d.ts.map +1 -0
- package/dist/schemas/unified.js +453 -0
- package/dist/schemas/unified.js.map +1 -0
- package/dist/services/compose.d.ts +107 -0
- package/dist/services/compose.d.ts.map +1 -0
- package/dist/services/compose.js +308 -0
- package/dist/services/compose.js.map +1 -0
- package/dist/services/container.d.ts +69 -0
- package/dist/services/container.d.ts.map +1 -0
- package/dist/services/container.js +111 -0
- package/dist/services/container.js.map +1 -0
- package/dist/services/docker.d.ts +243 -0
- package/dist/services/docker.d.ts.map +1 -0
- package/dist/services/docker.js +812 -0
- package/dist/services/docker.js.map +1 -0
- package/dist/services/file-service.d.ts +79 -0
- package/dist/services/file-service.d.ts.map +1 -0
- package/dist/services/file-service.js +226 -0
- package/dist/services/file-service.js.map +1 -0
- package/dist/services/interfaces.d.ts +537 -0
- package/dist/services/interfaces.d.ts.map +1 -0
- package/dist/services/interfaces.js +2 -0
- package/dist/services/interfaces.js.map +1 -0
- package/dist/services/ssh-pool-exec.d.ts +10 -0
- package/dist/services/ssh-pool-exec.d.ts.map +1 -0
- package/dist/services/ssh-pool-exec.js +10 -0
- package/dist/services/ssh-pool-exec.js.map +1 -0
- package/dist/services/ssh-pool.d.ts +66 -0
- package/dist/services/ssh-pool.d.ts.map +1 -0
- package/dist/services/ssh-pool.js +253 -0
- package/dist/services/ssh-pool.js.map +1 -0
- package/dist/services/ssh-service.d.ts +39 -0
- package/dist/services/ssh-service.d.ts.map +1 -0
- package/dist/services/ssh-service.js +143 -0
- package/dist/services/ssh-service.js.map +1 -0
- package/dist/services/ssh.d.ts +37 -0
- package/dist/services/ssh.d.ts.map +1 -0
- package/dist/services/ssh.js +50 -0
- package/dist/services/ssh.js.map +1 -0
- package/dist/tools/flux.d.ts +14 -0
- package/dist/tools/flux.d.ts.map +1 -0
- package/dist/tools/flux.js +86 -0
- package/dist/tools/flux.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +43 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/scout.d.ts +14 -0
- package/dist/tools/scout.d.ts.map +1 -0
- package/dist/tools/scout.js +96 -0
- package/dist/tools/scout.js.map +1 -0
- package/dist/tools/unified.d.ts +7 -0
- package/dist/tools/unified.d.ts.map +1 -0
- package/dist/tools/unified.js +827 -0
- package/dist/tools/unified.js.map +1 -0
- package/dist/types.d.ts +93 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/errors.d.ts +60 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +131 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/help.d.ts +69 -0
- package/dist/utils/help.d.ts.map +1 -0
- package/dist/utils/help.js +259 -0
- package/dist/utils/help.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/path-security.d.ts +64 -0
- package/dist/utils/path-security.d.ts.map +1 -0
- package/dist/utils/path-security.js +138 -0
- package/dist/utils/path-security.js.map +1 -0
- 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"}
|