@fractalizer/mcp-cli 0.3.18 → 1.0.1
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 +158 -266
- package/dist/commands/connect.command.d.ts +18 -15
- package/dist/commands/connect.command.d.ts.map +1 -1
- package/dist/commands/connect.command.js +66 -40
- package/dist/commands/connect.command.js.map +1 -1
- package/dist/commands/disconnect.command.d.ts +5 -17
- package/dist/commands/disconnect.command.d.ts.map +1 -1
- package/dist/commands/disconnect.command.js +4 -15
- package/dist/commands/disconnect.command.js.map +1 -1
- package/dist/commands/doctor.command.d.ts +34 -0
- package/dist/commands/doctor.command.d.ts.map +1 -0
- package/dist/commands/doctor.command.js +321 -0
- package/dist/commands/doctor.command.js.map +1 -0
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +2 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/list.command.d.ts +4 -9
- package/dist/commands/list.command.d.ts.map +1 -1
- package/dist/commands/list.command.js +1 -5
- package/dist/commands/list.command.js.map +1 -1
- package/dist/commands/status.command.d.ts +6 -13
- package/dist/commands/status.command.d.ts.map +1 -1
- package/dist/commands/status.command.js +18 -12
- package/dist/commands/status.command.js.map +1 -1
- package/dist/commands/validate.command.d.ts +6 -11
- package/dist/commands/validate.command.d.ts.map +1 -1
- package/dist/commands/validate.command.js +15 -19
- package/dist/commands/validate.command.js.map +1 -1
- package/dist/connectors/base/base-connector.d.ts +31 -55
- package/dist/connectors/base/base-connector.d.ts.map +1 -1
- package/dist/connectors/base/base-connector.js +71 -57
- package/dist/connectors/base/base-connector.js.map +1 -1
- package/dist/connectors/base/configurable-connector.d.ts +89 -24
- package/dist/connectors/base/configurable-connector.d.ts.map +1 -1
- package/dist/connectors/base/configurable-connector.js +266 -23
- package/dist/connectors/base/configurable-connector.js.map +1 -1
- package/dist/connectors/base/connector.interface.d.ts +29 -20
- package/dist/connectors/base/connector.interface.d.ts.map +1 -1
- package/dist/connectors/base/index.d.ts +0 -1
- package/dist/connectors/base/index.d.ts.map +1 -1
- package/dist/connectors/base/index.js +0 -1
- package/dist/connectors/base/index.js.map +1 -1
- package/dist/connectors/claude-code/claude-code.connector.d.ts +171 -21
- package/dist/connectors/claude-code/claude-code.connector.d.ts.map +1 -1
- package/dist/connectors/claude-code/claude-code.connector.js +368 -43
- package/dist/connectors/claude-code/claude-code.connector.js.map +1 -1
- package/dist/connectors/connector-factory.d.ts +15 -15
- package/dist/connectors/connector-factory.d.ts.map +1 -1
- package/dist/connectors/connector-factory.js +61 -18
- package/dist/connectors/connector-factory.js.map +1 -1
- package/dist/connectors/index.d.ts +0 -4
- package/dist/connectors/index.d.ts.map +1 -1
- package/dist/connectors/index.js +2 -8
- package/dist/connectors/index.js.map +1 -1
- package/dist/connectors/registry.d.ts +20 -27
- package/dist/connectors/registry.d.ts.map +1 -1
- package/dist/connectors/registry.js +34 -34
- package/dist/connectors/registry.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/{base.types.d.ts → client.types.d.ts} +37 -30
- package/dist/types/client.types.d.ts.map +1 -0
- package/dist/types/client.types.js +6 -0
- package/dist/types/client.types.js.map +1 -0
- package/dist/types/doctor.types.d.ts +91 -0
- package/dist/types/doctor.types.d.ts.map +1 -0
- package/dist/types/doctor.types.js +12 -0
- package/dist/types/doctor.types.js.map +1 -0
- package/dist/types/launch.types.d.ts +59 -0
- package/dist/types/launch.types.d.ts.map +1 -0
- package/dist/types/launch.types.js +6 -0
- package/dist/types/launch.types.js.map +1 -0
- package/dist/types.d.ts +23 -14
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +9 -2
- package/dist/types.js.map +1 -1
- package/dist/utils/command-executor.d.ts +39 -3
- package/dist/utils/command-executor.d.ts.map +1 -1
- package/dist/utils/command-executor.js +95 -8
- package/dist/utils/command-executor.js.map +1 -1
- package/dist/utils/config-manager.d.ts +25 -42
- package/dist/utils/config-manager.d.ts.map +1 -1
- package/dist/utils/config-manager.js +21 -49
- package/dist/utils/config-manager.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/interactive-prompter.d.ts +16 -64
- package/dist/utils/interactive-prompter.d.ts.map +1 -1
- package/dist/utils/interactive-prompter.js +12 -65
- package/dist/utils/interactive-prompter.js.map +1 -1
- package/dist/utils/launch-spec-helpers.d.ts +38 -0
- package/dist/utils/launch-spec-helpers.d.ts.map +1 -0
- package/dist/utils/launch-spec-helpers.js +131 -0
- package/dist/utils/launch-spec-helpers.js.map +1 -0
- package/package.json +2 -2
- package/dist/connectors/base/file-based-connector.d.ts +0 -97
- package/dist/connectors/base/file-based-connector.d.ts.map +0 -1
- package/dist/connectors/base/file-based-connector.js +0 -185
- package/dist/connectors/base/file-based-connector.js.map +0 -1
- package/dist/connectors/claude-desktop/claude-desktop.connector.d.ts +0 -38
- package/dist/connectors/claude-desktop/claude-desktop.connector.d.ts.map +0 -1
- package/dist/connectors/claude-desktop/claude-desktop.connector.js +0 -68
- package/dist/connectors/claude-desktop/claude-desktop.connector.js.map +0 -1
- package/dist/connectors/codex/codex.connector.d.ts +0 -51
- package/dist/connectors/codex/codex.connector.d.ts.map +0 -1
- package/dist/connectors/codex/codex.connector.js +0 -76
- package/dist/connectors/codex/codex.connector.js.map +0 -1
- package/dist/connectors/gemini/gemini.connector.d.ts +0 -41
- package/dist/connectors/gemini/gemini.connector.d.ts.map +0 -1
- package/dist/connectors/gemini/gemini.connector.js +0 -61
- package/dist/connectors/gemini/gemini.connector.js.map +0 -1
- package/dist/connectors/qwen/qwen.connector.d.ts +0 -41
- package/dist/connectors/qwen/qwen.connector.d.ts.map +0 -1
- package/dist/connectors/qwen/qwen.connector.js +0 -61
- package/dist/connectors/qwen/qwen.connector.js.map +0 -1
- package/dist/types/base.types.d.ts.map +0 -1
- package/dist/types/base.types.js +0 -6
- package/dist/types/base.types.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-executor.js","sourceRoot":"","sources":["../../src/utils/command-executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"command-executor.js","sourceRoot":"","sources":["../../src/utils/command-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,74 +2,57 @@
|
|
|
2
2
|
* Generic менеджер конфигурации MCP сервера
|
|
3
3
|
* @packageDocumentation
|
|
4
4
|
*/
|
|
5
|
-
import type {
|
|
5
|
+
import type { ConfigManagerOptions } from '../types/client.types.js';
|
|
6
6
|
/**
|
|
7
|
-
* Generic менеджер конфигурации MCP
|
|
7
|
+
* Generic менеджер конфигурации MCP сервера.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* Хранит конфигурацию в `~/.{projectName}/config.json`. Адаптер ОБЯЗАН передать
|
|
10
|
+
* `options.serialize` — это явное решение, какие поля сохранять (защита от
|
|
11
|
+
* случайной утечки секретов).
|
|
10
12
|
*
|
|
11
13
|
* @example
|
|
12
14
|
* ```typescript
|
|
13
|
-
*
|
|
14
|
-
* interface YandexTrackerMCPConfig extends BaseMCPServerConfig {
|
|
15
|
-
* token: string; // СЕКРЕТ - не сохраняется
|
|
16
|
-
* orgId: string; // Безопасно - сохраняется
|
|
17
|
-
* apiBase?: string; // Безопасно - сохраняется
|
|
18
|
-
* }
|
|
15
|
+
* interface YtConfig { token: string; orgId: string; apiBase?: string }
|
|
19
16
|
*
|
|
20
|
-
*
|
|
21
|
-
* const configManager = new ConfigManager<YandexTrackerMCPConfig>({
|
|
17
|
+
* const cm = new ConfigManager<YtConfig>({
|
|
22
18
|
* projectName: 'fractalizer_mcp_yandex_tracker',
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* safeFields: ['orgId', 'apiBase', 'logLevel', 'projectPath'],
|
|
26
|
-
* });
|
|
27
|
-
*
|
|
28
|
-
* // Сохранение конфигурации
|
|
29
|
-
* await configManager.save({
|
|
30
|
-
* token: 'secret-token',
|
|
31
|
-
* orgId: 'my-org',
|
|
32
|
-
* projectPath: '/path/to/project',
|
|
33
|
-
* logLevel: 'info',
|
|
19
|
+
* // serialize-хук явно исключает секреты:
|
|
20
|
+
* serialize: (cfg) => ({ orgId: cfg.orgId, apiBase: cfg.apiBase }),
|
|
34
21
|
* });
|
|
35
22
|
*
|
|
36
|
-
*
|
|
37
|
-
* const saved = await
|
|
38
|
-
* // saved = { orgId: 'my-org', logLevel: 'info', projectPath: '/path/to/project' }
|
|
39
|
-
* // token НЕ сохранен и будет запрошен заново
|
|
23
|
+
* await cm.save({ token: 's3cr3t', orgId: 'org-1' });
|
|
24
|
+
* const saved = await cm.load(); // { orgId: 'org-1' }
|
|
40
25
|
* ```
|
|
41
26
|
*/
|
|
42
|
-
export declare class ConfigManager<
|
|
27
|
+
export declare class ConfigManager<TDomainConfig extends object> {
|
|
43
28
|
private readonly options;
|
|
44
29
|
private readonly configPath;
|
|
45
|
-
constructor(options: ConfigManagerOptions<
|
|
30
|
+
constructor(options: ConfigManagerOptions<TDomainConfig>);
|
|
46
31
|
/**
|
|
47
|
-
* Загрузить
|
|
32
|
+
* Загрузить сохранённую конфигурацию.
|
|
48
33
|
*
|
|
49
|
-
* @returns Partial конфигурацию
|
|
34
|
+
* @returns Partial конфигурацию или `undefined`, если файл не существует.
|
|
50
35
|
*/
|
|
51
|
-
load(): Promise<Partial<
|
|
36
|
+
load(): Promise<Partial<TDomainConfig> | undefined>;
|
|
52
37
|
/**
|
|
53
|
-
* Сохранить
|
|
54
|
-
* Автоматически фильтрует только безопасные поля
|
|
38
|
+
* Сохранить конфигурацию.
|
|
55
39
|
*
|
|
56
|
-
*
|
|
40
|
+
* Всегда вызывается `options.serialize` — гарантия явного решения о том,
|
|
41
|
+
* какие поля попадают в файл (защита от утечки секретов).
|
|
42
|
+
*
|
|
43
|
+
* @param config - Полная конфигурация MCP сервера.
|
|
57
44
|
*/
|
|
58
|
-
save(config:
|
|
45
|
+
save(config: TDomainConfig): Promise<void>;
|
|
59
46
|
/**
|
|
60
|
-
* Удалить
|
|
47
|
+
* Удалить сохранённую конфигурацию.
|
|
61
48
|
*/
|
|
62
49
|
delete(): Promise<void>;
|
|
63
50
|
/**
|
|
64
|
-
* Проверить существование
|
|
65
|
-
*
|
|
66
|
-
* @returns true если файл конфигурации существует
|
|
51
|
+
* Проверить существование конфигурации.
|
|
67
52
|
*/
|
|
68
53
|
exists(): Promise<boolean>;
|
|
69
54
|
/**
|
|
70
|
-
* Получить путь к файлу
|
|
71
|
-
*
|
|
72
|
-
* @returns Абсолютный путь к config.json
|
|
55
|
+
* Получить путь к файлу конфигурации.
|
|
73
56
|
*/
|
|
74
57
|
getConfigPath(): string;
|
|
75
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/utils/config-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/utils/config-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAGrE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,aAAa,CAAC,aAAa,SAAS,MAAM;IAGzC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAEP,OAAO,EAAE,oBAAoB,CAAC,aAAa,CAAC;IAMzE;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC;IAkBzD;;;;;;;OAOG;IACG,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAYhD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAO7B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC;;OAEG;IACH,aAAa,IAAI,MAAM;CAGxB"}
|
|
@@ -5,39 +5,24 @@
|
|
|
5
5
|
import * as path from 'path';
|
|
6
6
|
import { FileManager } from './file-manager.js';
|
|
7
7
|
/**
|
|
8
|
-
* Generic менеджер конфигурации MCP
|
|
8
|
+
* Generic менеджер конфигурации MCP сервера.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
10
|
+
* Хранит конфигурацию в `~/.{projectName}/config.json`. Адаптер ОБЯЗАН передать
|
|
11
|
+
* `options.serialize` — это явное решение, какие поля сохранять (защита от
|
|
12
|
+
* случайной утечки секретов).
|
|
11
13
|
*
|
|
12
14
|
* @example
|
|
13
15
|
* ```typescript
|
|
14
|
-
*
|
|
15
|
-
* interface YandexTrackerMCPConfig extends BaseMCPServerConfig {
|
|
16
|
-
* token: string; // СЕКРЕТ - не сохраняется
|
|
17
|
-
* orgId: string; // Безопасно - сохраняется
|
|
18
|
-
* apiBase?: string; // Безопасно - сохраняется
|
|
19
|
-
* }
|
|
16
|
+
* interface YtConfig { token: string; orgId: string; apiBase?: string }
|
|
20
17
|
*
|
|
21
|
-
*
|
|
22
|
-
* const configManager = new ConfigManager<YandexTrackerMCPConfig>({
|
|
18
|
+
* const cm = new ConfigManager<YtConfig>({
|
|
23
19
|
* projectName: 'fractalizer_mcp_yandex_tracker',
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* safeFields: ['orgId', 'apiBase', 'logLevel', 'projectPath'],
|
|
20
|
+
* // serialize-хук явно исключает секреты:
|
|
21
|
+
* serialize: (cfg) => ({ orgId: cfg.orgId, apiBase: cfg.apiBase }),
|
|
27
22
|
* });
|
|
28
23
|
*
|
|
29
|
-
*
|
|
30
|
-
* await
|
|
31
|
-
* token: 'secret-token',
|
|
32
|
-
* orgId: 'my-org',
|
|
33
|
-
* projectPath: '/path/to/project',
|
|
34
|
-
* logLevel: 'info',
|
|
35
|
-
* });
|
|
36
|
-
*
|
|
37
|
-
* // Загрузка конфигурации
|
|
38
|
-
* const saved = await configManager.load();
|
|
39
|
-
* // saved = { orgId: 'my-org', logLevel: 'info', projectPath: '/path/to/project' }
|
|
40
|
-
* // token НЕ сохранен и будет запрошен заново
|
|
24
|
+
* await cm.save({ token: 's3cr3t', orgId: 'org-1' });
|
|
25
|
+
* const saved = await cm.load(); // { orgId: 'org-1' }
|
|
41
26
|
* ```
|
|
42
27
|
*/
|
|
43
28
|
export class ConfigManager {
|
|
@@ -50,9 +35,9 @@ export class ConfigManager {
|
|
|
50
35
|
this.configPath = path.join(homeDir, configDir, 'config.json');
|
|
51
36
|
}
|
|
52
37
|
/**
|
|
53
|
-
* Загрузить
|
|
38
|
+
* Загрузить сохранённую конфигурацию.
|
|
54
39
|
*
|
|
55
|
-
* @returns Partial конфигурацию
|
|
40
|
+
* @returns Partial конфигурацию или `undefined`, если файл не существует.
|
|
56
41
|
*/
|
|
57
42
|
async load() {
|
|
58
43
|
try {
|
|
@@ -60,7 +45,6 @@ export class ConfigManager {
|
|
|
60
45
|
return undefined;
|
|
61
46
|
}
|
|
62
47
|
const data = await FileManager.readJSON(this.configPath);
|
|
63
|
-
// Кастомная десериализация если задана
|
|
64
48
|
if (this.options.deserialize) {
|
|
65
49
|
return this.options.deserialize(data);
|
|
66
50
|
}
|
|
@@ -71,31 +55,23 @@ export class ConfigManager {
|
|
|
71
55
|
}
|
|
72
56
|
}
|
|
73
57
|
/**
|
|
74
|
-
* Сохранить
|
|
75
|
-
*
|
|
58
|
+
* Сохранить конфигурацию.
|
|
59
|
+
*
|
|
60
|
+
* Всегда вызывается `options.serialize` — гарантия явного решения о том,
|
|
61
|
+
* какие поля попадают в файл (защита от утечки секретов).
|
|
76
62
|
*
|
|
77
|
-
* @param config - Полная конфигурация MCP
|
|
63
|
+
* @param config - Полная конфигурация MCP сервера.
|
|
78
64
|
*/
|
|
79
65
|
async save(config) {
|
|
80
66
|
const configDir = path.dirname(this.configPath);
|
|
81
67
|
await FileManager.ensureDir(configDir);
|
|
82
|
-
|
|
83
|
-
const safeConfig = {};
|
|
84
|
-
for (const field of this.options.safeFields) {
|
|
85
|
-
if (field in config) {
|
|
86
|
-
safeConfig[field] = config[field];
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
// Кастомная сериализация если задана
|
|
90
|
-
const dataToSave = this.options.serialize
|
|
91
|
-
? this.options.serialize(config)
|
|
92
|
-
: safeConfig;
|
|
68
|
+
const dataToSave = this.options.serialize(config);
|
|
93
69
|
await FileManager.writeJSON(this.configPath, dataToSave);
|
|
94
70
|
// Безопасные права доступа (только владелец)
|
|
95
71
|
await FileManager.setPermissions(this.configPath, 0o600);
|
|
96
72
|
}
|
|
97
73
|
/**
|
|
98
|
-
* Удалить
|
|
74
|
+
* Удалить сохранённую конфигурацию.
|
|
99
75
|
*/
|
|
100
76
|
async delete() {
|
|
101
77
|
if (await FileManager.exists(this.configPath)) {
|
|
@@ -104,17 +80,13 @@ export class ConfigManager {
|
|
|
104
80
|
}
|
|
105
81
|
}
|
|
106
82
|
/**
|
|
107
|
-
* Проверить существование
|
|
108
|
-
*
|
|
109
|
-
* @returns true если файл конфигурации существует
|
|
83
|
+
* Проверить существование конфигурации.
|
|
110
84
|
*/
|
|
111
85
|
async exists() {
|
|
112
86
|
return FileManager.exists(this.configPath);
|
|
113
87
|
}
|
|
114
88
|
/**
|
|
115
|
-
* Получить путь к файлу
|
|
116
|
-
*
|
|
117
|
-
* @returns Абсолютный путь к config.json
|
|
89
|
+
* Получить путь к файлу конфигурации.
|
|
118
90
|
*/
|
|
119
91
|
getConfigPath() {
|
|
120
92
|
return this.configPath;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/utils/config-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/utils/config-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,aAAa;IAGK;IAFZ,UAAU,CAAS;IAEpC,YAA6B,OAA4C;QAA5C,YAAO,GAAP,OAAO,CAAqC;QACvE,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IACjE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;gBACjD,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,CAA0B,IAAI,CAAC,UAAU,CAAC,CAAC;YAElF,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;YAED,OAAO,IAA8B,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,IAAI,CAAC,MAAqB;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAEvC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAElD,MAAM,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAEzD,6CAA6C;QAC7C,MAAM,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9C,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YACvC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC"}
|
package/dist/utils/index.js
CHANGED
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC"}
|
|
@@ -2,104 +2,56 @@
|
|
|
2
2
|
* Generic interactive prompter for collecting MCP server configuration
|
|
3
3
|
* @packageDocumentation
|
|
4
4
|
*/
|
|
5
|
-
import type {
|
|
5
|
+
import type { MCPClientInfo, ConfigPromptDefinition } from '../types.js';
|
|
6
6
|
/**
|
|
7
|
-
* Generic интерактивный сборщик конфигурации
|
|
7
|
+
* Generic интерактивный сборщик конфигурации MCP сервера.
|
|
8
|
+
*
|
|
9
|
+
* @template TDomainConfig - Тип доменной конфигурации (произвольный объект).
|
|
8
10
|
*
|
|
9
11
|
* @example
|
|
10
12
|
* ```typescript
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* {
|
|
14
|
-
* name: 'token',
|
|
15
|
-
* type: 'password',
|
|
16
|
-
* message: 'OAuth токен:',
|
|
17
|
-
* validate: (v) => v.length > 0 || 'Токен обязателен',
|
|
18
|
-
* },
|
|
19
|
-
* {
|
|
20
|
-
* name: 'orgId',
|
|
21
|
-
* type: 'input',
|
|
22
|
-
* message: 'ID организации:',
|
|
23
|
-
* },
|
|
13
|
+
* const prompts: ConfigPromptDefinition<{ token: string; orgId: string }>[] = [
|
|
14
|
+
* { name: 'token', type: 'password', message: 'OAuth токен:' },
|
|
15
|
+
* { name: 'orgId', type: 'input', message: 'ID организации:' },
|
|
24
16
|
* ];
|
|
25
17
|
*
|
|
26
|
-
*
|
|
27
|
-
* const prompter = new InteractivePrompter(ytPrompts);
|
|
18
|
+
* const prompter = new InteractivePrompter(prompts);
|
|
28
19
|
* const config = await prompter.promptServerConfig();
|
|
29
20
|
* ```
|
|
30
|
-
*
|
|
31
|
-
* @template TConfig - Тип конфигурации MCP сервера (расширяет BaseMCPServerConfig)
|
|
32
21
|
*/
|
|
33
|
-
export declare class InteractivePrompter<
|
|
22
|
+
export declare class InteractivePrompter<TDomainConfig extends object> {
|
|
34
23
|
private readonly configPrompts;
|
|
35
24
|
/**
|
|
36
25
|
* @param configPrompts - Определения промптов для сбора конфигурации
|
|
37
26
|
*/
|
|
38
|
-
constructor(configPrompts: ConfigPromptDefinition<
|
|
27
|
+
constructor(configPrompts: ConfigPromptDefinition<TDomainConfig>[]);
|
|
39
28
|
/**
|
|
40
|
-
* Собрать конфигурацию
|
|
29
|
+
* Собрать конфигурацию через интерактивные промпты.
|
|
41
30
|
*
|
|
42
31
|
* @param savedConfig - Ранее сохраненная конфигурация (для значений по умолчанию)
|
|
43
|
-
* @returns Собранная конфигурация
|
|
44
|
-
*
|
|
45
|
-
* @example
|
|
46
|
-
* ```typescript
|
|
47
|
-
* const savedConfig = await configManager.load();
|
|
48
|
-
* const config = await prompter.promptServerConfig(savedConfig);
|
|
49
|
-
* // config = { token: '...', orgId: '...', apiBase: '...', logLevel: 'info' }
|
|
50
|
-
* ```
|
|
32
|
+
* @returns Собранная доменная конфигурация
|
|
51
33
|
*/
|
|
52
|
-
promptServerConfig(savedConfig?: Partial<
|
|
34
|
+
promptServerConfig(savedConfig?: Partial<TDomainConfig>): Promise<TDomainConfig>;
|
|
53
35
|
/**
|
|
54
|
-
* Выбор MCP клиента из списка
|
|
36
|
+
* Выбор MCP клиента из списка установленных.
|
|
55
37
|
*
|
|
56
38
|
* @param clients - Список доступных MCP клиентов
|
|
57
39
|
* @returns Имя выбранного клиента
|
|
58
|
-
*
|
|
59
|
-
* @example
|
|
60
|
-
* ```typescript
|
|
61
|
-
* const installed = await registry.findInstalled();
|
|
62
|
-
* const clientName = await InteractivePrompter.promptClientSelection(installed);
|
|
63
|
-
* // clientName = 'claude-desktop' | 'claude-code' | ...
|
|
64
|
-
* ```
|
|
65
40
|
*/
|
|
66
41
|
static promptClientSelection(clients: MCPClientInfo[]): Promise<string>;
|
|
67
42
|
/**
|
|
68
|
-
* Запросить подтверждение (yes/no) у
|
|
43
|
+
* Запросить подтверждение (yes/no) у пользователя.
|
|
69
44
|
*
|
|
70
45
|
* @param message - Сообщение для отображения
|
|
71
46
|
* @param defaultValue - Значение по умолчанию (true = yes, false = no)
|
|
72
|
-
* @returns true если пользователь подтвердил, false иначе
|
|
73
|
-
*
|
|
74
|
-
* @example
|
|
75
|
-
* ```typescript
|
|
76
|
-
* const shouldOverwrite = await InteractivePrompter.promptConfirmation(
|
|
77
|
-
* 'Конфигурация уже существует. Перезаписать?',
|
|
78
|
-
* false
|
|
79
|
-
* );
|
|
80
|
-
* ```
|
|
81
47
|
*/
|
|
82
48
|
static promptConfirmation(message: string, defaultValue?: boolean): Promise<boolean>;
|
|
83
49
|
/**
|
|
84
|
-
* Выбор из списка
|
|
50
|
+
* Выбор из списка вариантов.
|
|
85
51
|
*
|
|
86
52
|
* @param message - Сообщение для отображения
|
|
87
53
|
* @param choices - Список вариантов выбора
|
|
88
54
|
* @returns Выбранное значение
|
|
89
|
-
*
|
|
90
|
-
* @example
|
|
91
|
-
* ```typescript
|
|
92
|
-
* const logLevel = await InteractivePrompter.promptSelection(
|
|
93
|
-
* 'Выберите уровень логирования:',
|
|
94
|
-
* [
|
|
95
|
-
* { name: 'Debug', value: 'debug' },
|
|
96
|
-
* { name: 'Info', value: 'info' },
|
|
97
|
-
* { name: 'Warning', value: 'warn' },
|
|
98
|
-
* ]
|
|
99
|
-
* );
|
|
100
|
-
* ```
|
|
101
|
-
*
|
|
102
|
-
* @template T - Тип возвращаемого значения (строка)
|
|
103
55
|
*/
|
|
104
56
|
static promptSelection<T extends string>(message: string, choices: Array<{
|
|
105
57
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-prompter.d.ts","sourceRoot":"","sources":["../../src/utils/interactive-prompter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"interactive-prompter.d.ts","sourceRoot":"","sources":["../../src/utils/interactive-prompter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAEzE;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,mBAAmB,CAAC,aAAa,SAAS,MAAM;IAI/C,OAAO,CAAC,QAAQ,CAAC,aAAa;IAH1C;;OAEG;gBAC0B,aAAa,EAAE,sBAAsB,CAAC,aAAa,CAAC,EAAE;IAEnF;;;;;OAKG;IACG,kBAAkB,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IA+CtF;;;;;OAKG;WACU,qBAAqB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAgB7E;;;;;OAKG;WACU,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAavF;;;;;;OAMG;WACU,eAAe,CAAC,CAAC,SAAS,MAAM,EAC3C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC;CAYd"}
|
|
@@ -4,31 +4,20 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import inquirer from 'inquirer';
|
|
6
6
|
/**
|
|
7
|
-
* Generic интерактивный сборщик конфигурации
|
|
7
|
+
* Generic интерактивный сборщик конфигурации MCP сервера.
|
|
8
|
+
*
|
|
9
|
+
* @template TDomainConfig - Тип доменной конфигурации (произвольный объект).
|
|
8
10
|
*
|
|
9
11
|
* @example
|
|
10
12
|
* ```typescript
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* {
|
|
14
|
-
* name: 'token',
|
|
15
|
-
* type: 'password',
|
|
16
|
-
* message: 'OAuth токен:',
|
|
17
|
-
* validate: (v) => v.length > 0 || 'Токен обязателен',
|
|
18
|
-
* },
|
|
19
|
-
* {
|
|
20
|
-
* name: 'orgId',
|
|
21
|
-
* type: 'input',
|
|
22
|
-
* message: 'ID организации:',
|
|
23
|
-
* },
|
|
13
|
+
* const prompts: ConfigPromptDefinition<{ token: string; orgId: string }>[] = [
|
|
14
|
+
* { name: 'token', type: 'password', message: 'OAuth токен:' },
|
|
15
|
+
* { name: 'orgId', type: 'input', message: 'ID организации:' },
|
|
24
16
|
* ];
|
|
25
17
|
*
|
|
26
|
-
*
|
|
27
|
-
* const prompter = new InteractivePrompter(ytPrompts);
|
|
18
|
+
* const prompter = new InteractivePrompter(prompts);
|
|
28
19
|
* const config = await prompter.promptServerConfig();
|
|
29
20
|
* ```
|
|
30
|
-
*
|
|
31
|
-
* @template TConfig - Тип конфигурации MCP сервера (расширяет BaseMCPServerConfig)
|
|
32
21
|
*/
|
|
33
22
|
export class InteractivePrompter {
|
|
34
23
|
configPrompts;
|
|
@@ -39,17 +28,10 @@ export class InteractivePrompter {
|
|
|
39
28
|
this.configPrompts = configPrompts;
|
|
40
29
|
}
|
|
41
30
|
/**
|
|
42
|
-
* Собрать конфигурацию
|
|
31
|
+
* Собрать конфигурацию через интерактивные промпты.
|
|
43
32
|
*
|
|
44
33
|
* @param savedConfig - Ранее сохраненная конфигурация (для значений по умолчанию)
|
|
45
|
-
* @returns Собранная конфигурация
|
|
46
|
-
*
|
|
47
|
-
* @example
|
|
48
|
-
* ```typescript
|
|
49
|
-
* const savedConfig = await configManager.load();
|
|
50
|
-
* const config = await prompter.promptServerConfig(savedConfig);
|
|
51
|
-
* // config = { token: '...', orgId: '...', apiBase: '...', logLevel: 'info' }
|
|
52
|
-
* ```
|
|
34
|
+
* @returns Собранная доменная конфигурация
|
|
53
35
|
*/
|
|
54
36
|
async promptServerConfig(savedConfig) {
|
|
55
37
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -59,7 +41,6 @@ export class InteractivePrompter {
|
|
|
59
41
|
name: String(prompt.name),
|
|
60
42
|
message: prompt.message,
|
|
61
43
|
};
|
|
62
|
-
// Add default value
|
|
63
44
|
if (prompt.default !== undefined) {
|
|
64
45
|
if (typeof prompt.default === 'function') {
|
|
65
46
|
question['default'] = () => {
|
|
@@ -71,19 +52,15 @@ export class InteractivePrompter {
|
|
|
71
52
|
question['default'] = prompt.default;
|
|
72
53
|
}
|
|
73
54
|
}
|
|
74
|
-
// Add validate function
|
|
75
55
|
if (prompt.validate !== undefined) {
|
|
76
56
|
question['validate'] = prompt.validate;
|
|
77
57
|
}
|
|
78
|
-
// Add choices
|
|
79
58
|
if (prompt.choices !== undefined) {
|
|
80
59
|
question['choices'] = prompt.choices;
|
|
81
60
|
}
|
|
82
|
-
// Add when condition
|
|
83
61
|
if (prompt.when !== undefined) {
|
|
84
62
|
question['when'] = prompt.when;
|
|
85
63
|
}
|
|
86
|
-
// Add mask (password fields)
|
|
87
64
|
if (prompt.mask !== undefined) {
|
|
88
65
|
question['mask'] = prompt.mask;
|
|
89
66
|
}
|
|
@@ -96,17 +73,10 @@ export class InteractivePrompter {
|
|
|
96
73
|
return answers;
|
|
97
74
|
}
|
|
98
75
|
/**
|
|
99
|
-
* Выбор MCP клиента из списка
|
|
76
|
+
* Выбор MCP клиента из списка установленных.
|
|
100
77
|
*
|
|
101
78
|
* @param clients - Список доступных MCP клиентов
|
|
102
79
|
* @returns Имя выбранного клиента
|
|
103
|
-
*
|
|
104
|
-
* @example
|
|
105
|
-
* ```typescript
|
|
106
|
-
* const installed = await registry.findInstalled();
|
|
107
|
-
* const clientName = await InteractivePrompter.promptClientSelection(installed);
|
|
108
|
-
* // clientName = 'claude-desktop' | 'claude-code' | ...
|
|
109
|
-
* ```
|
|
110
80
|
*/
|
|
111
81
|
static async promptClientSelection(clients) {
|
|
112
82
|
const { selectedClient } = await inquirer.prompt([
|
|
@@ -123,19 +93,10 @@ export class InteractivePrompter {
|
|
|
123
93
|
return selectedClient;
|
|
124
94
|
}
|
|
125
95
|
/**
|
|
126
|
-
* Запросить подтверждение (yes/no) у
|
|
96
|
+
* Запросить подтверждение (yes/no) у пользователя.
|
|
127
97
|
*
|
|
128
98
|
* @param message - Сообщение для отображения
|
|
129
99
|
* @param defaultValue - Значение по умолчанию (true = yes, false = no)
|
|
130
|
-
* @returns true если пользователь подтвердил, false иначе
|
|
131
|
-
*
|
|
132
|
-
* @example
|
|
133
|
-
* ```typescript
|
|
134
|
-
* const shouldOverwrite = await InteractivePrompter.promptConfirmation(
|
|
135
|
-
* 'Конфигурация уже существует. Перезаписать?',
|
|
136
|
-
* false
|
|
137
|
-
* );
|
|
138
|
-
* ```
|
|
139
100
|
*/
|
|
140
101
|
static async promptConfirmation(message, defaultValue = true) {
|
|
141
102
|
const { confirmed } = await inquirer.prompt([
|
|
@@ -149,25 +110,11 @@ export class InteractivePrompter {
|
|
|
149
110
|
return confirmed;
|
|
150
111
|
}
|
|
151
112
|
/**
|
|
152
|
-
* Выбор из списка
|
|
113
|
+
* Выбор из списка вариантов.
|
|
153
114
|
*
|
|
154
115
|
* @param message - Сообщение для отображения
|
|
155
116
|
* @param choices - Список вариантов выбора
|
|
156
117
|
* @returns Выбранное значение
|
|
157
|
-
*
|
|
158
|
-
* @example
|
|
159
|
-
* ```typescript
|
|
160
|
-
* const logLevel = await InteractivePrompter.promptSelection(
|
|
161
|
-
* 'Выберите уровень логирования:',
|
|
162
|
-
* [
|
|
163
|
-
* { name: 'Debug', value: 'debug' },
|
|
164
|
-
* { name: 'Info', value: 'info' },
|
|
165
|
-
* { name: 'Warning', value: 'warn' },
|
|
166
|
-
* ]
|
|
167
|
-
* );
|
|
168
|
-
* ```
|
|
169
|
-
*
|
|
170
|
-
* @template T - Тип возвращаемого значения (строка)
|
|
171
118
|
*/
|
|
172
119
|
static async promptSelection(message, choices) {
|
|
173
120
|
const { selected } = await inquirer.prompt([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-prompter.js","sourceRoot":"","sources":["../../src/utils/interactive-prompter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,UAAU,CAAC;AAGhC
|
|
1
|
+
{"version":3,"file":"interactive-prompter.js","sourceRoot":"","sources":["../../src/utils/interactive-prompter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Утилиты для работы со спецификациями запуска MCP серверов.
|
|
3
|
+
*
|
|
4
|
+
* Извлечены из {@link BaseConnector.validateLaunchSpec} и
|
|
5
|
+
* {@link ConfigurableConnector.commandExistsOnDisk} для переиспользования
|
|
6
|
+
* в команде `doctor` без дублирования логики.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
import type { ServerLaunchSpec } from '../types/launch.types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Определить путь к исполняемому файлу, который реально нужно проверить на диске,
|
|
13
|
+
* из спецификации запуска.
|
|
14
|
+
*
|
|
15
|
+
* Логика выровнена с {@link BaseConnector.validateLaunchSpec}:
|
|
16
|
+
* - Если `spec.command` — абсолютный путь → возвращаем его.
|
|
17
|
+
* - Если `spec.command === 'node'` → парсим `args` как Node argv:
|
|
18
|
+
* пропускаем флаги-without-value (любые `-*`/`--*` без `=` не из whitelist)
|
|
19
|
+
* и пары `flag value` для флагов из {@link NODE_FLAGS_WITH_VALUE}.
|
|
20
|
+
* Первый positional аргумент после options — это путь к скрипту.
|
|
21
|
+
* Возвращаем его, только если он абсолютный (иначе `null`).
|
|
22
|
+
* - Во всех остальных случаях (`npx`, `pipx`, относительная команда из PATH) →
|
|
23
|
+
* возвращаем `null` (проверка на диске не применима).
|
|
24
|
+
*
|
|
25
|
+
* @param spec - Спецификация запуска
|
|
26
|
+
* @returns Абсолютный путь к проверяемому файлу или `null`
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* // node /abs/server.cjs → '/abs/server.cjs'
|
|
31
|
+
* // node --no-warnings /abs/server.cjs → '/abs/server.cjs'
|
|
32
|
+
* // node --import /abs/preload.mjs /abs/server.cjs → '/abs/server.cjs'
|
|
33
|
+
* // node --import=/abs/preload.mjs /abs/server.cjs → '/abs/server.cjs'
|
|
34
|
+
* // node --version → null (нет positional абсолютного пути)
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function resolveExecutablePath(spec: ServerLaunchSpec): string | null;
|
|
38
|
+
//# sourceMappingURL=launch-spec-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-spec-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/launch-spec-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AA2DjE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAQ3E"}
|