@hypnosis/docker-mcp-server 1.0.1 → 1.0.3
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/dist/adapters/adapter-registry.d.ts +5 -5
- package/dist/adapters/adapter-registry.js +5 -5
- package/dist/adapters/database-adapter.d.ts +8 -8
- package/dist/adapters/database-adapter.js +1 -1
- package/dist/adapters/postgresql.d.ts +8 -8
- package/dist/adapters/postgresql.js +26 -26
- package/dist/adapters/postgresql.js.map +1 -1
- package/dist/adapters/redis.d.ts +9 -9
- package/dist/adapters/redis.js +23 -23
- package/dist/adapters/redis.js.map +1 -1
- package/dist/adapters/sqlite.d.ts +6 -6
- package/dist/adapters/sqlite.js +14 -14
- package/dist/adapters/sqlite.js.map +1 -1
- package/dist/adapters/types.d.ts +6 -6
- package/dist/adapters/types.js +1 -1
- package/dist/discovery/project-discovery.d.ts.map +1 -1
- package/dist/discovery/project-discovery.js +17 -3
- package/dist/discovery/project-discovery.js.map +1 -1
- package/dist/index.js +55 -17
- package/dist/index.js.map +1 -1
- package/dist/managers/compose-manager.d.ts.map +1 -1
- package/dist/managers/compose-manager.js +33 -4
- package/dist/managers/compose-manager.js.map +1 -1
- package/dist/managers/container-manager.d.ts +13 -13
- package/dist/managers/container-manager.js +28 -28
- package/dist/managers/container-manager.js.map +1 -1
- package/dist/tools/container-tools.d.ts +4 -4
- package/dist/tools/container-tools.js +8 -8
- package/dist/tools/container-tools.js.map +1 -1
- package/dist/tools/database-tools.d.ts +3 -3
- package/dist/tools/database-tools.js +4 -4
- package/dist/tools/database-tools.js.map +1 -1
- package/dist/tools/env-tools.d.ts +4 -4
- package/dist/tools/env-tools.js +9 -9
- package/dist/tools/env-tools.js.map +1 -1
- package/dist/tools/executor-tool.d.ts +3 -3
- package/dist/tools/executor-tool.js +6 -6
- package/dist/tools/executor-tool.js.map +1 -1
- package/dist/tools/mcp-health-tool.d.ts +4 -4
- package/dist/tools/mcp-health-tool.js +5 -5
- package/dist/tools/mcp-health-tool.js.map +1 -1
- package/dist/utils/compose-exec.d.ts.map +1 -1
- package/dist/utils/compose-exec.js +16 -1
- package/dist/utils/compose-exec.js.map +1 -1
- package/dist/utils/port-utils.d.ts +24 -0
- package/dist/utils/port-utils.d.ts.map +1 -0
- package/dist/utils/port-utils.js +89 -0
- package/dist/utils/port-utils.js.map +1 -0
- package/dist/utils/workspace.d.ts +34 -0
- package/dist/utils/workspace.d.ts.map +1 -0
- package/dist/utils/workspace.js +52 -0
- package/dist/utils/workspace.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Universal Executor Tool
|
|
3
|
-
*
|
|
3
|
+
* Execute any commands in container via docker exec
|
|
4
4
|
*/
|
|
5
5
|
import { ContainerManager } from '../managers/container-manager.js';
|
|
6
6
|
import { ProjectDiscovery } from '../discovery/project-discovery.js';
|
|
@@ -52,7 +52,7 @@ export class ExecutorTool {
|
|
|
52
52
|
throw new Error('service and command parameters are required');
|
|
53
53
|
}
|
|
54
54
|
const project = await this.projectDiscovery.findProject();
|
|
55
|
-
//
|
|
55
|
+
// Parse command string to array
|
|
56
56
|
const commandParts = this.parseCommand(args.command);
|
|
57
57
|
logger.info(`Executing in ${args.service}: ${args.command}`);
|
|
58
58
|
const output = await this.containerManager.exec(args.service, project.name, commandParts, {
|
|
@@ -83,12 +83,12 @@ export class ExecutorTool {
|
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
/**
|
|
86
|
-
*
|
|
87
|
-
* TODO:
|
|
86
|
+
* Simple parsing of command string → array
|
|
87
|
+
* TODO: improve for quoted strings in the future
|
|
88
88
|
*/
|
|
89
89
|
parseCommand(command) {
|
|
90
|
-
//
|
|
91
|
-
//
|
|
90
|
+
// Simple split by spaces
|
|
91
|
+
// In the future, can add support for quoted strings
|
|
92
92
|
return command.split(' ').filter((s) => s.length > 0);
|
|
93
93
|
}
|
|
94
94
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor-tool.js","sourceRoot":"","sources":["../../src/tools/executor-tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,OAAO,YAAY;IACf,gBAAgB,CAAmB;IACnC,gBAAgB,CAAmB;IAE3C;QACE,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAC/C,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACjD,CAAC;IAED,OAAO;QACL,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,+HAA+H;YAC5I,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,sCAAsC;qBACpD;oBACD,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,gFAAgF;qBAC9F;oBACD,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,iCAAiC;qBAC/C;oBACD,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,8BAA8B;qBAC5C;oBACD,WAAW,EAAE;wBACX,IAAI,EAAE,SAAS;wBACf,WAAW,EAAE,6CAA6C;wBAC1D,OAAO,EAAE,KAAK;qBACf;iBACF;gBACD,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;aACjC;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAwB;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,SAM3B,CAAC;QAEF,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;YAE1D,gCAAgC;YAChC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAErD,MAAM,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAE7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAC7C,IAAI,CAAC,OAAO,EACZ,OAAO,CAAC,IAAI,EACZ,YAAY,EACZ;gBACE,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,KAAK;aACvC,EACD,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,UAAU,CACnB,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,MAAM;qBACb;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC3C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE;qBAChC;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,YAAY,CAAC,OAAe;QAClC,
|
|
1
|
+
{"version":3,"file":"executor-tool.js","sourceRoot":"","sources":["../../src/tools/executor-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MCP Health Tool
|
|
3
|
-
*
|
|
3
|
+
* MCP server self-diagnostics
|
|
4
4
|
*/
|
|
5
5
|
import { CallToolRequest, Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
6
6
|
export declare class MCPHealthTool {
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
8
|
+
* Register health tool
|
|
9
9
|
*/
|
|
10
10
|
getTool(): Tool;
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
12
|
+
* Handle tool call
|
|
13
13
|
*/
|
|
14
14
|
handleCall(request: CallToolRequest): Promise<{
|
|
15
15
|
content: {
|
|
@@ -25,7 +25,7 @@ export declare class MCPHealthTool {
|
|
|
25
25
|
isError: boolean;
|
|
26
26
|
}>;
|
|
27
27
|
/**
|
|
28
|
-
*
|
|
28
|
+
* Perform health checks
|
|
29
29
|
*/
|
|
30
30
|
check(): Promise<{
|
|
31
31
|
status: 'healthy' | 'degraded' | 'unhealthy';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MCP Health Tool
|
|
3
|
-
*
|
|
3
|
+
* MCP server self-diagnostics
|
|
4
4
|
*/
|
|
5
5
|
import { getDockerClient } from '../utils/docker-client.js';
|
|
6
6
|
import { ProjectDiscovery } from '../discovery/project-discovery.js';
|
|
@@ -9,7 +9,7 @@ import { projectConfigCache } from '../utils/cache.js';
|
|
|
9
9
|
import { logger } from '../utils/logger.js';
|
|
10
10
|
export class MCPHealthTool {
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
12
|
+
* Register health tool
|
|
13
13
|
*/
|
|
14
14
|
getTool() {
|
|
15
15
|
return {
|
|
@@ -22,7 +22,7 @@ export class MCPHealthTool {
|
|
|
22
22
|
};
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
|
-
*
|
|
25
|
+
* Handle tool call
|
|
26
26
|
*/
|
|
27
27
|
async handleCall(request) {
|
|
28
28
|
try {
|
|
@@ -50,7 +50,7 @@ export class MCPHealthTool {
|
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
/**
|
|
53
|
-
*
|
|
53
|
+
* Perform health checks
|
|
54
54
|
*/
|
|
55
55
|
async check() {
|
|
56
56
|
const checks = {};
|
|
@@ -99,7 +99,7 @@ export class MCPHealthTool {
|
|
|
99
99
|
checks.cache = {
|
|
100
100
|
status: 'ok',
|
|
101
101
|
size: projectConfigCache.size(),
|
|
102
|
-
ttl: 60, // seconds (hardcoded,
|
|
102
|
+
ttl: 60, // seconds (hardcoded, as not exported in Cache)
|
|
103
103
|
};
|
|
104
104
|
// 5. Memory Usage
|
|
105
105
|
const mem = process.memoryUsage();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-health-tool.js","sourceRoot":"","sources":["../../src/tools/mcp-health-tool.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"mcp-health-tool.js","sourceRoot":"","sources":["../../src/tools/mcp-health-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose-exec.d.ts","sourceRoot":"","sources":["../../src/utils/compose-exec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,qBAAa,WAAW;IACtB;;OAEG;IACH,MAAM,CAAC,GAAG,CACR,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAO,GAC7B,MAAM;
|
|
1
|
+
{"version":3,"file":"compose-exec.d.ts","sourceRoot":"","sources":["../../src/utils/compose-exec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,qBAAa,WAAW;IACtB;;OAEG;IACH,MAAM,CAAC,GAAG,CACR,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAO,GAC7B,MAAM;CA0CV"}
|
|
@@ -25,7 +25,22 @@ export class ComposeExec {
|
|
|
25
25
|
}
|
|
26
26
|
catch (error) {
|
|
27
27
|
logger.error('docker-compose command failed:', error);
|
|
28
|
-
|
|
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
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Если есть stdout (может содержать полезную информацию)
|
|
38
|
+
if (error.stdout) {
|
|
39
|
+
const stdout = error.stdout.toString ? error.stdout.toString() : String(error.stdout);
|
|
40
|
+
if (stdout && stdout.trim()) {
|
|
41
|
+
errorMessage = `${errorMessage}\n${stdout}`;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
29
44
|
throw new Error(`docker-compose failed: ${errorMessage}`);
|
|
30
45
|
}
|
|
31
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose-exec.js","sourceRoot":"","sources":["../../src/utils/compose-exec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,OAAO,WAAW;IACtB;;OAEG;IACH,MAAM,CAAC,GAAG,CACR,WAAmB,EACnB,IAAc,EACd,UAA4B,EAAE;QAE9B,kDAAkD;QAClD,MAAM,GAAG,GAAG,qBAAqB,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAEjE,MAAM,CAAC,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;QACjD,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,sBAAsB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE;gBAC3B,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"compose-exec.js","sourceRoot":"","sources":["../../src/utils/compose-exec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,OAAO,WAAW;IACtB;;OAEG;IACH,MAAM,CAAC,GAAG,CACR,WAAmB,EACnB,IAAc,EACd,UAA4B,EAAE;QAE9B,kDAAkD;QAClD,MAAM,GAAG,GAAG,qBAAqB,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAEjE,MAAM,CAAC,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;QACjD,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,sBAAsB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE;gBAC3B,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YAEtD,wDAAwD;YACxD,IAAI,YAAY,GAAG,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;YAElD,8CAA8C;YAC9C,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACtF,IAAI,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7C,YAAY,GAAG,GAAG,YAAY,KAAK,MAAM,EAAE,CAAC;gBAC9C,CAAC;YACH,CAAC;YAED,yDAAyD;YACzD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACtF,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC5B,YAAY,GAAG,GAAG,YAAY,KAAK,MAAM,EAAE,CAAC;gBAC9C,CAAC;YACH,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port Utilities
|
|
3
|
+
* Утилиты для работы с портами Docker контейнеров
|
|
4
|
+
*/
|
|
5
|
+
export interface PortConflict {
|
|
6
|
+
port: number;
|
|
7
|
+
containerId: string;
|
|
8
|
+
containerName: string;
|
|
9
|
+
status: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Находит контейнер, который занимает указанный порт
|
|
13
|
+
*/
|
|
14
|
+
export declare function findContainerByPort(port: number): Promise<PortConflict | null>;
|
|
15
|
+
/**
|
|
16
|
+
* Извлекает номер порта из ошибки Docker
|
|
17
|
+
* Пример: "Bind for 0.0.0.0:5432 failed: port is already allocated" -> 5432
|
|
18
|
+
*/
|
|
19
|
+
export declare function extractPortFromError(errorMessage: string): number | null;
|
|
20
|
+
/**
|
|
21
|
+
* Останавливает контейнер по ID
|
|
22
|
+
*/
|
|
23
|
+
export declare function stopContainerById(containerId: string): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=port-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-utils.d.ts","sourceRoot":"","sources":["../../src/utils/port-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAmCpF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsBxE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB1E"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port Utilities
|
|
3
|
+
* Утилиты для работы с портами Docker контейнеров
|
|
4
|
+
*/
|
|
5
|
+
import { getDockerClient } from './docker-client.js';
|
|
6
|
+
import { logger } from './logger.js';
|
|
7
|
+
/**
|
|
8
|
+
* Находит контейнер, который занимает указанный порт
|
|
9
|
+
*/
|
|
10
|
+
export async function findContainerByPort(port) {
|
|
11
|
+
const docker = getDockerClient().getClient();
|
|
12
|
+
try {
|
|
13
|
+
// Получаем все контейнеры (включая остановленные)
|
|
14
|
+
const containers = await docker.listContainers({ all: true });
|
|
15
|
+
for (const containerInfo of containers) {
|
|
16
|
+
// Проверяем порты контейнера
|
|
17
|
+
if (containerInfo.Ports) {
|
|
18
|
+
for (const portInfo of containerInfo.Ports) {
|
|
19
|
+
// Проверяем published порт (0.0.0.0:5432 -> 5432/tcp)
|
|
20
|
+
if (portInfo.PublicPort === port) {
|
|
21
|
+
const containerId = containerInfo.Id;
|
|
22
|
+
const containerName = containerInfo.Names[0]?.replace(/^\//, '') || containerId.substring(0, 12);
|
|
23
|
+
const status = containerInfo.Status || 'unknown';
|
|
24
|
+
logger.info(`Found container using port ${port}: ${containerName} (${containerId.substring(0, 12)})`);
|
|
25
|
+
return {
|
|
26
|
+
port,
|
|
27
|
+
containerId,
|
|
28
|
+
containerName,
|
|
29
|
+
status,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
logger.error(`Failed to find container by port ${port}:`, error);
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Извлекает номер порта из ошибки Docker
|
|
44
|
+
* Пример: "Bind for 0.0.0.0:5432 failed: port is already allocated" -> 5432
|
|
45
|
+
*/
|
|
46
|
+
export function extractPortFromError(errorMessage) {
|
|
47
|
+
// Паттерн: "Bind for 0.0.0.0:5432 failed" или "port 5432 is already allocated"
|
|
48
|
+
const patterns = [
|
|
49
|
+
/Bind for [\d.]+:(\d+)/i, // "Bind for 0.0.0.0:5432"
|
|
50
|
+
/port (\d+) is already allocated/i, // "port 5432 is already allocated"
|
|
51
|
+
/port (\d+) is already in use/i, // "port 5432 is already in use"
|
|
52
|
+
/:(\d+) failed/i, // ":5432 failed" (fallback)
|
|
53
|
+
];
|
|
54
|
+
for (const pattern of patterns) {
|
|
55
|
+
const match = errorMessage.match(pattern);
|
|
56
|
+
if (match && match[1]) {
|
|
57
|
+
const port = parseInt(match[1], 10);
|
|
58
|
+
if (!isNaN(port) && port > 0 && port < 65536) {
|
|
59
|
+
logger.debug(`Extracted port ${port} using pattern: ${pattern}`);
|
|
60
|
+
return port;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
logger.debug('No port found in error message');
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Останавливает контейнер по ID
|
|
69
|
+
*/
|
|
70
|
+
export async function stopContainerById(containerId) {
|
|
71
|
+
const docker = getDockerClient().getClient();
|
|
72
|
+
try {
|
|
73
|
+
const container = docker.getContainer(containerId);
|
|
74
|
+
const info = await container.inspect();
|
|
75
|
+
if (info.State.Running) {
|
|
76
|
+
logger.info(`Stopping container ${containerId.substring(0, 12)}...`);
|
|
77
|
+
await container.stop();
|
|
78
|
+
logger.info(`Container ${containerId.substring(0, 12)} stopped successfully`);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
logger.debug(`Container ${containerId.substring(0, 12)} is not running`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
logger.error(`Failed to stop container ${containerId}:`, error);
|
|
86
|
+
throw new Error(`Failed to stop container: ${error.message}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=port-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-utils.js","sourceRoot":"","sources":["../../src/utils/port-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace Root Management
|
|
3
|
+
* Хранит workspace root полученный от MCP клиента
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Глобальное хранилище workspace root
|
|
7
|
+
* Устанавливается при инициализации MCP сервера через listRoots()
|
|
8
|
+
*/
|
|
9
|
+
declare class WorkspaceManager {
|
|
10
|
+
private workspaceRoot;
|
|
11
|
+
/**
|
|
12
|
+
* Устанавливает workspace root из MCP client roots
|
|
13
|
+
*/
|
|
14
|
+
setWorkspaceRoot(uri: string): void;
|
|
15
|
+
/**
|
|
16
|
+
* Возвращает workspace root или null если не установлен
|
|
17
|
+
*/
|
|
18
|
+
getWorkspaceRoot(): string | null;
|
|
19
|
+
/**
|
|
20
|
+
* Проверяет, установлен ли workspace root
|
|
21
|
+
*/
|
|
22
|
+
hasWorkspaceRoot(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Парсит file:// URI в обычный путь
|
|
25
|
+
*/
|
|
26
|
+
private parseFileUri;
|
|
27
|
+
/**
|
|
28
|
+
* Очищает workspace root (для тестов)
|
|
29
|
+
*/
|
|
30
|
+
clear(): void;
|
|
31
|
+
}
|
|
32
|
+
export declare const workspaceManager: WorkspaceManager;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/utils/workspace.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,cAAM,gBAAgB;IACpB,OAAO,CAAC,aAAa,CAAuB;IAE5C;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOnC;;OAEG;IACH,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAIjC;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAGD,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace Root Management
|
|
3
|
+
* Хранит workspace root полученный от MCP клиента
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from './logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* Глобальное хранилище workspace root
|
|
8
|
+
* Устанавливается при инициализации MCP сервера через listRoots()
|
|
9
|
+
*/
|
|
10
|
+
class WorkspaceManager {
|
|
11
|
+
workspaceRoot = null;
|
|
12
|
+
/**
|
|
13
|
+
* Устанавливает workspace root из MCP client roots
|
|
14
|
+
*/
|
|
15
|
+
setWorkspaceRoot(uri) {
|
|
16
|
+
// URI в формате file:///path/to/workspace
|
|
17
|
+
const path = this.parseFileUri(uri);
|
|
18
|
+
this.workspaceRoot = path;
|
|
19
|
+
logger.info(`Workspace root set: ${path}`);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Возвращает workspace root или null если не установлен
|
|
23
|
+
*/
|
|
24
|
+
getWorkspaceRoot() {
|
|
25
|
+
return this.workspaceRoot;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Проверяет, установлен ли workspace root
|
|
29
|
+
*/
|
|
30
|
+
hasWorkspaceRoot() {
|
|
31
|
+
return this.workspaceRoot !== null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Парсит file:// URI в обычный путь
|
|
35
|
+
*/
|
|
36
|
+
parseFileUri(uri) {
|
|
37
|
+
if (uri.startsWith('file://')) {
|
|
38
|
+
// file:///path/to/workspace -> /path/to/workspace
|
|
39
|
+
return decodeURIComponent(uri.slice(7));
|
|
40
|
+
}
|
|
41
|
+
return uri;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Очищает workspace root (для тестов)
|
|
45
|
+
*/
|
|
46
|
+
clear() {
|
|
47
|
+
this.workspaceRoot = null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Singleton instance
|
|
51
|
+
export const workspaceManager = new WorkspaceManager();
|
|
52
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/utils/workspace.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;GAGG;AACH,MAAM,gBAAgB;IACZ,aAAa,GAAkB,IAAI,CAAC;IAE5C;;OAEG;IACH,gBAAgB,CAAC,GAAW;QAC1B,0CAA0C;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,GAAW;QAC9B,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,kDAAkD;YAClD,OAAO,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;CACF;AAED,qBAAqB;AACrB,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC"}
|