@hypnosis/docker-mcp-server 1.0.4 → 1.3.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 +99 -28
- package/dist/adapters/database-adapter.d.ts +9 -5
- package/dist/adapters/database-adapter.d.ts.map +1 -1
- package/dist/adapters/postgresql.d.ts +14 -5
- package/dist/adapters/postgresql.d.ts.map +1 -1
- package/dist/adapters/postgresql.js +36 -23
- package/dist/adapters/postgresql.js.map +1 -1
- package/dist/adapters/redis.d.ts +10 -1
- package/dist/adapters/redis.d.ts.map +1 -1
- package/dist/adapters/redis.js +28 -13
- package/dist/adapters/redis.js.map +1 -1
- package/dist/adapters/sqlite.d.ts +11 -1
- package/dist/adapters/sqlite.d.ts.map +1 -1
- package/dist/adapters/sqlite.js +11 -7
- package/dist/adapters/sqlite.js.map +1 -1
- package/dist/adapters/types.d.ts +7 -0
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/discovery/compose-parser.d.ts +4 -0
- package/dist/discovery/compose-parser.d.ts.map +1 -1
- package/dist/discovery/compose-parser.js +27 -5
- package/dist/discovery/compose-parser.js.map +1 -1
- package/dist/discovery/project-discovery.d.ts.map +1 -1
- package/dist/discovery/project-discovery.js +28 -2
- package/dist/discovery/project-discovery.js.map +1 -1
- package/dist/discovery/remote-discovery.d.ts +99 -0
- package/dist/discovery/remote-discovery.d.ts.map +1 -0
- package/dist/discovery/remote-discovery.js +410 -0
- package/dist/discovery/remote-discovery.js.map +1 -0
- package/dist/discovery/types.d.ts +4 -0
- package/dist/discovery/types.d.ts.map +1 -1
- package/dist/index.js +76 -24
- package/dist/index.js.map +1 -1
- package/dist/managers/compose-manager.d.ts +3 -1
- package/dist/managers/compose-manager.d.ts.map +1 -1
- package/dist/managers/compose-manager.js +10 -1
- package/dist/managers/compose-manager.js.map +1 -1
- package/dist/managers/container-manager.d.ts +11 -1
- package/dist/managers/container-manager.d.ts.map +1 -1
- package/dist/managers/container-manager.js +75 -76
- package/dist/managers/container-manager.js.map +1 -1
- package/dist/tools/container-tools.d.ts +1 -3
- package/dist/tools/container-tools.d.ts.map +1 -1
- package/dist/tools/container-tools.js +142 -28
- package/dist/tools/container-tools.js.map +1 -1
- package/dist/tools/database-tools.d.ts +15 -1
- package/dist/tools/database-tools.d.ts.map +1 -1
- package/dist/tools/database-tools.js +152 -16
- package/dist/tools/database-tools.js.map +1 -1
- package/dist/tools/discovery-tools.d.ts +22 -0
- package/dist/tools/discovery-tools.d.ts.map +1 -0
- package/dist/tools/discovery-tools.js +137 -0
- package/dist/tools/discovery-tools.js.map +1 -0
- package/dist/tools/env-tools.d.ts +1 -2
- package/dist/tools/env-tools.d.ts.map +1 -1
- package/dist/tools/env-tools.js +123 -22
- package/dist/tools/env-tools.js.map +1 -1
- package/dist/tools/executor-tool.d.ts +0 -2
- package/dist/tools/executor-tool.d.ts.map +1 -1
- package/dist/tools/executor-tool.js +27 -9
- package/dist/tools/executor-tool.js.map +1 -1
- package/dist/tools/mcp-health-tool.d.ts +9 -0
- package/dist/tools/mcp-health-tool.d.ts.map +1 -1
- package/dist/tools/mcp-health-tool.js +34 -7
- package/dist/tools/mcp-health-tool.js.map +1 -1
- package/dist/tools/profile-tool.d.ts +39 -0
- package/dist/tools/profile-tool.d.ts.map +1 -0
- package/dist/tools/profile-tool.js +70 -0
- package/dist/tools/profile-tool.js.map +1 -0
- package/dist/utils/compose-exec.d.ts +28 -3
- package/dist/utils/compose-exec.d.ts.map +1 -1
- package/dist/utils/compose-exec.js +100 -26
- package/dist/utils/compose-exec.js.map +1 -1
- package/dist/utils/docker-client.d.ts +81 -8
- package/dist/utils/docker-client.d.ts.map +1 -1
- package/dist/utils/docker-client.js +520 -17
- package/dist/utils/docker-client.js.map +1 -1
- package/dist/utils/profile-resolver.d.ts +58 -0
- package/dist/utils/profile-resolver.d.ts.map +1 -0
- package/dist/utils/profile-resolver.js +218 -0
- package/dist/utils/profile-resolver.js.map +1 -0
- package/dist/utils/profiles-file.d.ts +57 -0
- package/dist/utils/profiles-file.d.ts.map +1 -0
- package/dist/utils/profiles-file.js +167 -0
- package/dist/utils/profiles-file.js.map +1 -0
- package/dist/utils/remote-compose.d.ts +32 -0
- package/dist/utils/remote-compose.d.ts.map +1 -0
- package/dist/utils/remote-compose.js +69 -0
- package/dist/utils/remote-compose.js.map +1 -0
- package/dist/utils/retry.d.ts +49 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +120 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/schema-helpers.d.ts +96 -0
- package/dist/utils/schema-helpers.d.ts.map +1 -0
- package/dist/utils/schema-helpers.js +61 -0
- package/dist/utils/schema-helpers.js.map +1 -0
- package/dist/utils/ssh-config.d.ts +104 -0
- package/dist/utils/ssh-config.d.ts.map +1 -0
- package/dist/utils/ssh-config.js +346 -0
- package/dist/utils/ssh-config.js.map +1 -0
- package/dist/utils/ssh-exec.d.ts +59 -0
- package/dist/utils/ssh-exec.d.ts.map +1 -0
- package/dist/utils/ssh-exec.js +159 -0
- package/dist/utils/ssh-exec.js.map +1 -0
- package/package.json +21 -3
|
@@ -2,12 +2,37 @@
|
|
|
2
2
|
* Compose Exec
|
|
3
3
|
* CLI wrapper для docker-compose команд
|
|
4
4
|
*/
|
|
5
|
+
import type { SSHConfig } from './ssh-config.js';
|
|
6
|
+
export interface ComposeExecOptions {
|
|
7
|
+
/** Рабочая директория */
|
|
8
|
+
cwd?: string;
|
|
9
|
+
/** SSH конфигурация для удаленного Docker */
|
|
10
|
+
sshConfig?: SSHConfig | null;
|
|
11
|
+
/** Docker context (альтернатива SSH config) */
|
|
12
|
+
dockerContext?: string;
|
|
13
|
+
}
|
|
5
14
|
export declare class ComposeExec {
|
|
6
15
|
/**
|
|
7
16
|
* Выполнить docker-compose команду
|
|
17
|
+
* Поддерживает SSH через DOCKER_HOST или Docker context
|
|
18
|
+
*/
|
|
19
|
+
static run(composeFile: string, args: string[], options?: ComposeExecOptions): string;
|
|
20
|
+
/**
|
|
21
|
+
* Подготовить переменные окружения для выполнения команды
|
|
22
|
+
* Если указан SSH config, устанавливает DOCKER_HOST для удаленного Docker
|
|
23
|
+
*/
|
|
24
|
+
private static prepareEnvironment;
|
|
25
|
+
/**
|
|
26
|
+
* Создать Docker context для SSH подключения
|
|
27
|
+
* Используется как альтернатива DOCKER_HOST
|
|
28
|
+
*
|
|
29
|
+
* Примечание: Эта функция создает контекст через Docker CLI.
|
|
30
|
+
* Требует наличия Docker CLI и SSH доступа.
|
|
31
|
+
*/
|
|
32
|
+
static createDockerContext(contextName: string, sshConfig: SSHConfig): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Проверить существование Docker context
|
|
8
35
|
*/
|
|
9
|
-
static
|
|
10
|
-
cwd?: string;
|
|
11
|
-
}): string;
|
|
36
|
+
static contextExists(contextName: string): Promise<boolean>;
|
|
12
37
|
}
|
|
13
38
|
//# sourceMappingURL=compose-exec.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose-exec.d.ts","sourceRoot":"","sources":["../../src/utils/compose-exec.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"compose-exec.d.ts","sourceRoot":"","sources":["../../src/utils/compose-exec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IACjC,yBAAyB;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,+CAA+C;IAC/C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,WAAW;IACtB;;;OAGG;IACH,MAAM,CAAC,GAAG,CACR,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,kBAAuB,GAC/B,MAAM;IAuDT;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAajC;;;;;;OAMG;WACU,mBAAmB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,IAAI,CAAC;IA4BhB;;OAEG;WACU,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAuBlE"}
|
|
@@ -2,46 +2,120 @@
|
|
|
2
2
|
* Compose Exec
|
|
3
3
|
* CLI wrapper для docker-compose команд
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
5
|
+
import { spawnSync } from 'child_process';
|
|
6
6
|
import { logger } from './logger.js';
|
|
7
7
|
export class ComposeExec {
|
|
8
8
|
/**
|
|
9
9
|
* Выполнить docker-compose команду
|
|
10
|
+
* Поддерживает SSH через DOCKER_HOST или Docker context
|
|
10
11
|
*/
|
|
11
12
|
static run(composeFile, args, options = {}) {
|
|
12
|
-
//
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
// Используем docker compose (v2) вместо docker-compose (v1)
|
|
14
|
+
// docker compose работает везде, docker-compose может отсутствовать
|
|
15
|
+
let cmd = `docker compose -f ${composeFile}`;
|
|
16
|
+
// Добавляем Docker context (если указан)
|
|
17
|
+
if (options.dockerContext) {
|
|
18
|
+
cmd = `docker compose --context ${options.dockerContext} -f ${composeFile}`;
|
|
19
|
+
logger.debug(`Using Docker context: ${options.dockerContext}`);
|
|
20
|
+
}
|
|
21
|
+
cmd = `${cmd} ${args.join(' ')}`;
|
|
22
|
+
logger.debug(`Executing docker compose: ${cmd}`);
|
|
15
23
|
if (options.cwd) {
|
|
16
24
|
logger.debug(`Working directory: ${options.cwd}`);
|
|
17
25
|
}
|
|
26
|
+
// Подготавливаем окружение для выполнения команды
|
|
27
|
+
const env = this.prepareEnvironment(options.sshConfig);
|
|
28
|
+
// Разбиваем команду на части для spawnSync
|
|
29
|
+
const [command, ...commandArgs] = cmd.split(' ');
|
|
30
|
+
const result = spawnSync(command, commandArgs, {
|
|
31
|
+
cwd: options.cwd,
|
|
32
|
+
env: env,
|
|
33
|
+
encoding: 'utf-8',
|
|
34
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
35
|
+
});
|
|
36
|
+
// Проверяем exit code
|
|
37
|
+
if (result.status !== 0 && result.status !== null) {
|
|
38
|
+
// Команда завершилась с ошибкой
|
|
39
|
+
let errorMessage = result.stderr || result.stdout || 'Unknown error';
|
|
40
|
+
// Если есть stdout, добавляем его к сообщению
|
|
41
|
+
if (result.stdout && result.stdout.trim()) {
|
|
42
|
+
errorMessage = `${errorMessage}\n${result.stdout}`;
|
|
43
|
+
}
|
|
44
|
+
logger.error('docker compose command failed:', {
|
|
45
|
+
status: result.status,
|
|
46
|
+
stderr: result.stderr,
|
|
47
|
+
stdout: result.stdout,
|
|
48
|
+
});
|
|
49
|
+
throw new Error(`docker compose failed: ${errorMessage}`);
|
|
50
|
+
}
|
|
51
|
+
// Команда выполнена успешно (status === 0 или null)
|
|
52
|
+
// Возвращаем stdout, игнорируя stderr (он может содержать предупреждения)
|
|
53
|
+
return result.stdout || '';
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Подготовить переменные окружения для выполнения команды
|
|
57
|
+
* Если указан SSH config, устанавливает DOCKER_HOST для удаленного Docker
|
|
58
|
+
*/
|
|
59
|
+
static prepareEnvironment(sshConfig) {
|
|
60
|
+
const env = { ...process.env };
|
|
61
|
+
// Если указан SSH config, устанавливаем DOCKER_HOST
|
|
62
|
+
if (sshConfig) {
|
|
63
|
+
const dockerHost = `ssh://${sshConfig.username}@${sshConfig.host}:${sshConfig.port || 22}`;
|
|
64
|
+
env.DOCKER_HOST = dockerHost;
|
|
65
|
+
logger.debug(`Setting DOCKER_HOST=${dockerHost} for docker-compose`);
|
|
66
|
+
}
|
|
67
|
+
return env;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Создать Docker context для SSH подключения
|
|
71
|
+
* Используется как альтернатива DOCKER_HOST
|
|
72
|
+
*
|
|
73
|
+
* Примечание: Эта функция создает контекст через Docker CLI.
|
|
74
|
+
* Требует наличия Docker CLI и SSH доступа.
|
|
75
|
+
*/
|
|
76
|
+
static async createDockerContext(contextName, sshConfig) {
|
|
77
|
+
const dockerHost = `ssh://${sshConfig.username}@${sshConfig.host}:${sshConfig.port || 22}`;
|
|
78
|
+
const cmd = `docker context create ${contextName} --docker "host=${dockerHost}"`;
|
|
79
|
+
logger.debug(`Creating Docker context: ${cmd}`);
|
|
80
|
+
const [command, ...args] = cmd.split(' ');
|
|
81
|
+
const result = spawnSync(command, args, {
|
|
82
|
+
encoding: 'utf-8',
|
|
83
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
84
|
+
});
|
|
85
|
+
if (result.status !== 0 && result.status !== null) {
|
|
86
|
+
const errorMessage = result.stderr || result.stdout || 'Unknown error';
|
|
87
|
+
// Если контекст уже существует, это не критично
|
|
88
|
+
if (errorMessage.includes('already exists')) {
|
|
89
|
+
logger.warn(`Docker context "${contextName}" already exists`);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
logger.error(`Failed to create Docker context: ${errorMessage}`);
|
|
93
|
+
throw new Error(`Failed to create Docker context "${contextName}": ${errorMessage}`);
|
|
94
|
+
}
|
|
95
|
+
logger.info(`Docker context "${contextName}" created successfully`);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Проверить существование Docker context
|
|
99
|
+
*/
|
|
100
|
+
static async contextExists(contextName) {
|
|
18
101
|
try {
|
|
19
|
-
const
|
|
20
|
-
cwd: options.cwd,
|
|
102
|
+
const result = spawnSync('docker', ['context', 'ls', '--format', 'json'], {
|
|
21
103
|
encoding: 'utf-8',
|
|
22
104
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
23
105
|
});
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
catch (error) {
|
|
27
|
-
logger.error('docker-compose command failed:', error);
|
|
28
|
-
// Извлекаем полное сообщение об ошибке (включая stderr)
|
|
29
|
-
let errorMessage = error.message || String(error);
|
|
30
|
-
// Если есть stderr, добавляем его к сообщению
|
|
31
|
-
if (error.stderr) {
|
|
32
|
-
const stderr = error.stderr.toString ? error.stderr.toString() : String(error.stderr);
|
|
33
|
-
if (stderr && !errorMessage.includes(stderr)) {
|
|
34
|
-
errorMessage = `${errorMessage}\n${stderr}`;
|
|
35
|
-
}
|
|
106
|
+
if (result.status !== 0 && result.status !== null) {
|
|
107
|
+
return false;
|
|
36
108
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
109
|
+
const output = result.stdout || '';
|
|
110
|
+
const contexts = output
|
|
111
|
+
.trim()
|
|
112
|
+
.split('\n')
|
|
113
|
+
.filter((line) => line.trim())
|
|
114
|
+
.map((line) => JSON.parse(line));
|
|
115
|
+
return contexts.some((ctx) => ctx.Name === contextName);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return false;
|
|
45
119
|
}
|
|
46
120
|
}
|
|
47
121
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose-exec.js","sourceRoot":"","sources":["../../src/utils/compose-exec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"compose-exec.js","sourceRoot":"","sources":["../../src/utils/compose-exec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,33 +1,106 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Docker Client Wrapper
|
|
3
|
-
*
|
|
3
|
+
* Centralized Docker API management with SSH tunnel support
|
|
4
4
|
*/
|
|
5
5
|
import Docker from 'dockerode';
|
|
6
|
+
import type { SSHConfig } from './ssh-config.js';
|
|
6
7
|
/**
|
|
7
|
-
*
|
|
8
|
+
* Dockerode wrapper for centralized Docker API management
|
|
8
9
|
*/
|
|
9
10
|
export declare class DockerClient {
|
|
10
11
|
private docker;
|
|
11
|
-
|
|
12
|
+
private sshConfig;
|
|
13
|
+
readonly isRemote: boolean;
|
|
14
|
+
private activeSocketPath;
|
|
15
|
+
private sshProcessPid;
|
|
16
|
+
private tunnelCreationLock;
|
|
17
|
+
private tunnelHealthCheckInterval;
|
|
18
|
+
constructor(sshConfig?: SSHConfig | null);
|
|
19
|
+
/**
|
|
20
|
+
* Get SSH config for comparison
|
|
21
|
+
*/
|
|
22
|
+
getSSHConfig(): SSHConfig | null;
|
|
23
|
+
/**
|
|
24
|
+
* Get SSH host for identification
|
|
25
|
+
*/
|
|
26
|
+
getSSHHost(): string | null;
|
|
27
|
+
/**
|
|
28
|
+
* Cleanup SSH tunnel (called on shutdown)
|
|
29
|
+
*/
|
|
30
|
+
cleanup(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Ensure SSH tunnel is created and recreate Docker client with correct socket
|
|
33
|
+
* With mutex to prevent race conditions
|
|
34
|
+
*/
|
|
35
|
+
private ensureSSHTunnel;
|
|
36
|
+
/**
|
|
37
|
+
* Start periodic healthcheck for SSH tunnel
|
|
38
|
+
*/
|
|
39
|
+
private startTunnelHealthCheck;
|
|
40
|
+
/**
|
|
41
|
+
* Create SSH tunnel to remote Docker socket
|
|
42
|
+
* @returns Path to local socket file
|
|
43
|
+
*/
|
|
44
|
+
private createSSHTunnel;
|
|
45
|
+
/**
|
|
46
|
+
* Wait for socket file creation
|
|
47
|
+
*/
|
|
48
|
+
private waitForSocket;
|
|
49
|
+
/**
|
|
50
|
+
* Resolve SSH key path (support for ~)
|
|
51
|
+
*/
|
|
52
|
+
private resolveKeyPath;
|
|
12
53
|
/**
|
|
13
54
|
* Проверка подключения к Docker
|
|
55
|
+
* С retry логикой для удаленных подключений
|
|
14
56
|
*/
|
|
15
57
|
ping(): Promise<void>;
|
|
16
58
|
/**
|
|
17
|
-
*
|
|
59
|
+
* Get native Dockerode instance
|
|
18
60
|
*/
|
|
19
61
|
getClient(): Docker;
|
|
20
62
|
/**
|
|
21
|
-
*
|
|
63
|
+
* List containers
|
|
64
|
+
* With retry logic for remote connections
|
|
22
65
|
*/
|
|
23
66
|
listContainers(options?: Docker.ContainerListOptions): Promise<Docker.ContainerInfo[]>;
|
|
24
67
|
/**
|
|
25
|
-
*
|
|
68
|
+
* Get container by ID or name
|
|
26
69
|
*/
|
|
27
70
|
getContainer(id: string): Docker.Container;
|
|
28
71
|
}
|
|
29
72
|
/**
|
|
30
|
-
*
|
|
73
|
+
* Get singleton instance of DockerClient
|
|
74
|
+
* @param sshConfig - SSH configuration (optional, for remote Docker)
|
|
75
|
+
*/
|
|
76
|
+
export declare function getDockerClient(sshConfig?: SSHConfig | null): DockerClient;
|
|
77
|
+
/**
|
|
78
|
+
* Reset singleton instance (for testing)
|
|
79
|
+
*/
|
|
80
|
+
export declare function resetDockerClient(): void;
|
|
81
|
+
/**
|
|
82
|
+
* Cleanup all Docker clients (for graceful shutdown)
|
|
83
|
+
*/
|
|
84
|
+
export declare function cleanupDockerClient(): void;
|
|
85
|
+
/**
|
|
86
|
+
* Get Docker client for specific profile
|
|
87
|
+
* @param profileName - Profile name (undefined = local Docker)
|
|
88
|
+
* @returns DockerClient instance
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* // Local Docker (default)
|
|
92
|
+
* const localClient = getDockerClientForProfile();
|
|
93
|
+
*
|
|
94
|
+
* // Remote Docker (production profile)
|
|
95
|
+
* const prodClient = getDockerClientForProfile('production');
|
|
96
|
+
*/
|
|
97
|
+
export declare function getDockerClientForProfile(profileName?: string): DockerClient;
|
|
98
|
+
/**
|
|
99
|
+
* Clear client pool (for testing or cleanup)
|
|
100
|
+
*/
|
|
101
|
+
export declare function clearClientPool(): void;
|
|
102
|
+
/**
|
|
103
|
+
* Cleanup all Docker clients in pool (for graceful shutdown)
|
|
31
104
|
*/
|
|
32
|
-
export declare function
|
|
105
|
+
export declare function cleanupAllDockerClients(): void;
|
|
33
106
|
//# sourceMappingURL=docker-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker-client.d.ts","sourceRoot":"","sources":["../../src/utils/docker-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"docker-client.d.ts","sourceRoot":"","sources":["../../src/utils/docker-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,WAAW,CAAC;AAM/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAmB;IACpC,SAAgB,QAAQ,EAAE,OAAO,CAAC;IAClC,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,kBAAkB,CAAgC;IAC1D,OAAO,CAAC,yBAAyB,CAA+B;gBAEpD,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI;IAgBxC;;OAEG;IACH,YAAY,IAAI,SAAS,GAAG,IAAI;IAIhC;;OAEG;IACH,UAAU,IAAI,MAAM,GAAG,IAAI;IAI3B;;OAEG;IACH,OAAO,IAAI,IAAI;IAuCf;;;OAGG;YACW,eAAe;IA6C7B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoC9B;;;OAGG;YACW,eAAe;IAuI7B;;OAEG;YACW,aAAa;IAiB3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC3B;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;;OAGG;IACG,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,oBAAoB;IAsB1D;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,SAAS;CAG3C;AAKD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,YAAY,CA6B1E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C;AAoED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,CA4B5E;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAyBtC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAM9C"}
|