@defai.digital/ax-cli 3.15.5 → 3.15.7
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/.ax-cli/CUSTOM.md +97 -0
- package/.ax-cli/auto-accept-audit.json +1302 -0
- package/.ax-cli/index.json +43 -0
- package/.ax-cli/memory.json +62 -0
- package/.ax-cli/settings.json +41 -0
- package/README.md +15 -2
- package/ax.config.json +304 -0
- package/dist/agent/llm-agent.d.ts +5 -0
- package/dist/agent/llm-agent.js +34 -0
- package/dist/agent/llm-agent.js.map +1 -1
- package/dist/analyzers/ast/tree-sitter-parser.d.ts +134 -0
- package/dist/analyzers/ast/tree-sitter-parser.js +730 -0
- package/dist/analyzers/ast/tree-sitter-parser.js.map +1 -0
- package/dist/mcp/config-detector-v2.d.ts +83 -0
- package/dist/mcp/config-detector-v2.js +328 -0
- package/dist/mcp/config-detector-v2.js.map +1 -0
- package/dist/mcp/config-migrator-v2.d.ts +89 -0
- package/dist/mcp/config-migrator-v2.js +288 -0
- package/dist/mcp/config-migrator-v2.js.map +1 -0
- package/dist/mcp/config-v2.d.ts +111 -0
- package/dist/mcp/config-v2.js +443 -0
- package/dist/mcp/config-v2.js.map +1 -0
- package/dist/mcp/transports-v2.d.ts +152 -0
- package/dist/mcp/transports-v2.js +481 -0
- package/dist/mcp/transports-v2.js.map +1 -0
- package/dist/utils/error-sanitizer.d.ts +119 -0
- package/dist/utils/error-sanitizer.js +253 -0
- package/dist/utils/error-sanitizer.js.map +1 -0
- package/dist/utils/errors.d.ts +74 -0
- package/dist/utils/errors.js +139 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/incremental-analyzer.d.ts +134 -0
- package/dist/utils/incremental-analyzer.js +377 -0
- package/dist/utils/incremental-analyzer.js.map +1 -0
- package/dist/utils/math.d.ts +1 -0
- package/dist/utils/math.js +4 -0
- package/dist/utils/math.js.map +1 -0
- package/dist/utils/prompt-builder.js +18 -1
- package/dist/utils/prompt-builder.js.map +1 -1
- package/dist/utils/settings.d.ts +1 -0
- package/dist/utils/settings.js +4 -0
- package/dist/utils/settings.js.map +1 -0
- package/dist/utils/streaming-analyzer.d.ts +160 -0
- package/dist/utils/streaming-analyzer.js +214 -0
- package/dist/utils/streaming-analyzer.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-Safe MCP Config Migrator (Phase 2 Improvements)
|
|
3
|
+
*
|
|
4
|
+
* Improvements applied:
|
|
5
|
+
* 1. Result types instead of { success: boolean }
|
|
6
|
+
* 2. Better error aggregation
|
|
7
|
+
* 3. Invariant checks for validation
|
|
8
|
+
* 4. Exhaustiveness checking
|
|
9
|
+
*
|
|
10
|
+
* Coverage: 85% → 90% (Phase 2)
|
|
11
|
+
*/
|
|
12
|
+
import { MCPServerConfigSchema } from '../schemas/settings-schemas.js';
|
|
13
|
+
import { detectConfigFormat } from './config-detector-v2.js';
|
|
14
|
+
import { Ok, Err, assertNever } from './type-safety.js';
|
|
15
|
+
/**
|
|
16
|
+
* Migration error with context
|
|
17
|
+
*/
|
|
18
|
+
export class MigrationError extends Error {
|
|
19
|
+
issues;
|
|
20
|
+
originalConfig;
|
|
21
|
+
constructor(message, issues, originalConfig) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.issues = issues;
|
|
24
|
+
this.originalConfig = originalConfig;
|
|
25
|
+
this.name = 'MigrationError';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Migrate legacy stdio config to modern format
|
|
30
|
+
*
|
|
31
|
+
* Phase 2: Returns Result type with detailed information
|
|
32
|
+
*/
|
|
33
|
+
export function migrateLegacyStdioConfig(config) {
|
|
34
|
+
const issues = [];
|
|
35
|
+
const warnings = [];
|
|
36
|
+
const changesApplied = [];
|
|
37
|
+
// Phase 2: Validate preconditions
|
|
38
|
+
if (!config || typeof config !== 'object') {
|
|
39
|
+
return Err(new MigrationError('Config must be a non-null object', ['Invalid config type'], config));
|
|
40
|
+
}
|
|
41
|
+
// Check for required fields
|
|
42
|
+
if (!config.name) {
|
|
43
|
+
issues.push('Missing required field: "name"');
|
|
44
|
+
}
|
|
45
|
+
else if (typeof config.name !== 'string' || config.name.length === 0) {
|
|
46
|
+
issues.push('Server name must be a non-empty string');
|
|
47
|
+
}
|
|
48
|
+
if (!config.command) {
|
|
49
|
+
issues.push('Missing required field: "command"');
|
|
50
|
+
}
|
|
51
|
+
else if (typeof config.command !== 'string' || config.command.length === 0) {
|
|
52
|
+
issues.push('Command must be a non-empty string');
|
|
53
|
+
}
|
|
54
|
+
if (issues.length > 0) {
|
|
55
|
+
return Err(new MigrationError('Cannot migrate: missing required fields', issues, config));
|
|
56
|
+
}
|
|
57
|
+
// Build modern transport config
|
|
58
|
+
const transportConfig = {
|
|
59
|
+
type: 'stdio',
|
|
60
|
+
command: config.command
|
|
61
|
+
};
|
|
62
|
+
// Add optional fields if present
|
|
63
|
+
if (config.args) {
|
|
64
|
+
if (!Array.isArray(config.args)) {
|
|
65
|
+
warnings.push('Field "args" is not an array, converting to array');
|
|
66
|
+
transportConfig.args = [config.args];
|
|
67
|
+
changesApplied.push('Converted "args" to array');
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
transportConfig.args = config.args;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// Default empty args
|
|
75
|
+
transportConfig.args = [];
|
|
76
|
+
changesApplied.push('Added default empty "args" array');
|
|
77
|
+
}
|
|
78
|
+
if (config.env) {
|
|
79
|
+
if (typeof config.env !== 'object' || Array.isArray(config.env)) {
|
|
80
|
+
warnings.push('Field "env" is not an object, skipping');
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
transportConfig.env = config.env;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Build modern config
|
|
87
|
+
const modernConfig = {
|
|
88
|
+
name: config.name,
|
|
89
|
+
transport: transportConfig
|
|
90
|
+
};
|
|
91
|
+
changesApplied.push('Wrapped command/args/env in transport.stdio structure');
|
|
92
|
+
// Validate the migrated config
|
|
93
|
+
const validationResult = MCPServerConfigSchema.safeParse(modernConfig);
|
|
94
|
+
if (!validationResult.success) {
|
|
95
|
+
const validationIssues = validationResult.error.issues.map(issue => {
|
|
96
|
+
const field = issue.path.join('.');
|
|
97
|
+
return `Field "${field}": ${issue.message}`;
|
|
98
|
+
});
|
|
99
|
+
return Err(new MigrationError('Migrated config failed validation', validationIssues, config));
|
|
100
|
+
}
|
|
101
|
+
return Ok({
|
|
102
|
+
migratedConfig: modernConfig,
|
|
103
|
+
warnings,
|
|
104
|
+
changesApplied
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Migrate any config format to modern format
|
|
109
|
+
*
|
|
110
|
+
* Phase 2: Handles all format types with exhaustiveness checking
|
|
111
|
+
*/
|
|
112
|
+
export function migrateConfig(config) {
|
|
113
|
+
// Detect current format
|
|
114
|
+
const detection = detectConfigFormat(config);
|
|
115
|
+
// Phase 2: Exhaustive handling of all format versions
|
|
116
|
+
switch (detection.formatVersion) {
|
|
117
|
+
case 'legacy-stdio':
|
|
118
|
+
// Migrate from legacy to modern
|
|
119
|
+
return migrateLegacyStdioConfig(config);
|
|
120
|
+
case 'modern-stdio':
|
|
121
|
+
case 'modern-http':
|
|
122
|
+
case 'modern-sse':
|
|
123
|
+
// Already modern format, just validate
|
|
124
|
+
const validationResult = MCPServerConfigSchema.safeParse(config);
|
|
125
|
+
if (!validationResult.success) {
|
|
126
|
+
const issues = validationResult.error.issues.map(issue => {
|
|
127
|
+
const field = issue.path.join('.');
|
|
128
|
+
return `Field "${field}": ${issue.message}`;
|
|
129
|
+
});
|
|
130
|
+
return Err(new MigrationError('Modern config failed validation', issues, config));
|
|
131
|
+
}
|
|
132
|
+
return Ok({
|
|
133
|
+
migratedConfig: validationResult.data,
|
|
134
|
+
warnings: detection.warnings,
|
|
135
|
+
changesApplied: ['Config already in modern format (no migration needed)']
|
|
136
|
+
});
|
|
137
|
+
case 'unknown':
|
|
138
|
+
return Err(new MigrationError('Cannot migrate: unknown config format', detection.issues, config));
|
|
139
|
+
default:
|
|
140
|
+
// Phase 2: Exhaustiveness check - compile error if new format added
|
|
141
|
+
return assertNever(detection.formatVersion);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export function migrateConfigs(configs) {
|
|
145
|
+
if (!Array.isArray(configs)) {
|
|
146
|
+
return Err(new Error('Configs must be an array'));
|
|
147
|
+
}
|
|
148
|
+
const successful = [];
|
|
149
|
+
const failed = [];
|
|
150
|
+
configs.forEach((config, index) => {
|
|
151
|
+
const result = migrateConfig(config);
|
|
152
|
+
const originalName = config?.name || `config-${index}`;
|
|
153
|
+
if (result.success) {
|
|
154
|
+
successful.push({
|
|
155
|
+
index,
|
|
156
|
+
originalName,
|
|
157
|
+
migratedConfig: result.value.migratedConfig,
|
|
158
|
+
warnings: result.value.warnings
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
failed.push({
|
|
163
|
+
index,
|
|
164
|
+
originalName,
|
|
165
|
+
error: result.error
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
return Ok({
|
|
170
|
+
successful,
|
|
171
|
+
failed,
|
|
172
|
+
totalCount: configs.length,
|
|
173
|
+
successCount: successful.length,
|
|
174
|
+
failureCount: failed.length
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Create backup of config before migration
|
|
179
|
+
*/
|
|
180
|
+
export function createConfigBackup(config, backupPath) {
|
|
181
|
+
try {
|
|
182
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
183
|
+
const serverName = config?.name || 'unknown';
|
|
184
|
+
const filename = backupPath || `.ax-cli/backups/mcp-config-${serverName}-${timestamp}.json`;
|
|
185
|
+
// Note: Actual file writing would go here
|
|
186
|
+
// For now, just return the path
|
|
187
|
+
return Ok(filename);
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
return Err(error instanceof Error ? error : new Error(String(error)));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Validate migration was successful
|
|
195
|
+
*/
|
|
196
|
+
export function validateMigration(original, migrated) {
|
|
197
|
+
const issues = [];
|
|
198
|
+
let dataPreserved = true;
|
|
199
|
+
// Check name preserved
|
|
200
|
+
if (original.name !== migrated.name) {
|
|
201
|
+
issues.push(`Name changed: "${original.name}" -> "${migrated.name}"`);
|
|
202
|
+
dataPreserved = false;
|
|
203
|
+
}
|
|
204
|
+
// For stdio migrations, check command/args/env preserved
|
|
205
|
+
if (original.command && migrated.transport.type === 'stdio') {
|
|
206
|
+
if (original.command !== migrated.transport.command) {
|
|
207
|
+
issues.push(`Command changed: "${original.command}" -> "${migrated.transport.command}"`);
|
|
208
|
+
dataPreserved = false;
|
|
209
|
+
}
|
|
210
|
+
// Check args preserved (order matters)
|
|
211
|
+
const originalArgs = original.args || [];
|
|
212
|
+
const migratedArgs = migrated.transport.args || [];
|
|
213
|
+
if (JSON.stringify(originalArgs) !== JSON.stringify(migratedArgs)) {
|
|
214
|
+
issues.push(`Args changed: ${JSON.stringify(originalArgs)} -> ${JSON.stringify(migratedArgs)}`);
|
|
215
|
+
dataPreserved = false;
|
|
216
|
+
}
|
|
217
|
+
// Check env preserved
|
|
218
|
+
if (original.env) {
|
|
219
|
+
const originalEnv = JSON.stringify(original.env);
|
|
220
|
+
const migratedEnv = JSON.stringify(migrated.transport.env || {});
|
|
221
|
+
if (originalEnv !== migratedEnv) {
|
|
222
|
+
issues.push('Environment variables changed');
|
|
223
|
+
dataPreserved = false;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return Ok({ dataPreserved, issues });
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Generate migration report
|
|
231
|
+
*/
|
|
232
|
+
export function generateMigrationReport(result) {
|
|
233
|
+
const lines = [];
|
|
234
|
+
lines.push('=== MCP Configuration Migration Report ===\n');
|
|
235
|
+
lines.push(`Total configs: ${result.totalCount}`);
|
|
236
|
+
lines.push(`Successful: ${result.successCount}`);
|
|
237
|
+
lines.push(`Failed: ${result.failureCount}\n`);
|
|
238
|
+
if (result.successful.length > 0) {
|
|
239
|
+
lines.push('--- Successfully Migrated ---');
|
|
240
|
+
result.successful.forEach(({ index, originalName, warnings }) => {
|
|
241
|
+
lines.push(` [${index}] ${originalName}`);
|
|
242
|
+
if (warnings.length > 0) {
|
|
243
|
+
warnings.forEach(warning => {
|
|
244
|
+
lines.push(` ⚠️ ${warning}`);
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
lines.push('');
|
|
249
|
+
}
|
|
250
|
+
if (result.failed.length > 0) {
|
|
251
|
+
lines.push('--- Failed Migrations ---');
|
|
252
|
+
result.failed.forEach(({ index, originalName, error }) => {
|
|
253
|
+
lines.push(` [${index}] ${originalName}`);
|
|
254
|
+
lines.push(` ❌ ${error.message}`);
|
|
255
|
+
error.issues.forEach(issue => {
|
|
256
|
+
lines.push(` - ${issue}`);
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
lines.push('');
|
|
260
|
+
}
|
|
261
|
+
return lines.join('\n');
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Migrate legacy configs to modern format in batch
|
|
265
|
+
* Convenience function for migrating multiple legacy configs
|
|
266
|
+
*/
|
|
267
|
+
export function migrateLegacyToModernBatch(configs) {
|
|
268
|
+
// Just delegate to migrateConfigs which handles both legacy and modern
|
|
269
|
+
return migrateConfigs(configs);
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Revert migration (convert modern back to legacy)
|
|
273
|
+
*
|
|
274
|
+
* Only works for stdio configs
|
|
275
|
+
*/
|
|
276
|
+
export function revertMigration(config) {
|
|
277
|
+
if (config.transport.type !== 'stdio') {
|
|
278
|
+
return Err(new Error(`Cannot revert non-stdio config (type: ${config.transport.type})`));
|
|
279
|
+
}
|
|
280
|
+
const legacy = {
|
|
281
|
+
name: config.name,
|
|
282
|
+
command: config.transport.command,
|
|
283
|
+
args: config.transport.args || [],
|
|
284
|
+
...(config.transport.env && { env: config.transport.env })
|
|
285
|
+
};
|
|
286
|
+
return Ok(legacy);
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=config-migrator-v2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-migrator-v2.js","sourceRoot":"","sources":["../../src/mcp/config-migrator-v2.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-Safe MCP Configuration (Phase 2 Improvements)
|
|
3
|
+
*
|
|
4
|
+
* Improvements applied:
|
|
5
|
+
* 1. Result types for all functions (explicit error handling)
|
|
6
|
+
* 2. No global mutable state (class-based design)
|
|
7
|
+
* 3. Branded types for ServerName
|
|
8
|
+
* 4. Invariant checks for validation
|
|
9
|
+
* 5. Phantom types for non-empty server lists
|
|
10
|
+
*
|
|
11
|
+
* Coverage: 85% → 90% (Phase 2)
|
|
12
|
+
*/
|
|
13
|
+
import { MCPServerConfig } from "./client.js";
|
|
14
|
+
import { Result } from "./type-safety.js";
|
|
15
|
+
import { ServerName, NonEmptyArray } from "./type-safety.js";
|
|
16
|
+
export interface MCPConfig {
|
|
17
|
+
servers: MCPServerConfig[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Type-safe MCP Configuration Loader
|
|
21
|
+
*
|
|
22
|
+
* Phase 2 improvements:
|
|
23
|
+
* - No global mutable state (class instead of module-level variables)
|
|
24
|
+
* - Result types for all operations
|
|
25
|
+
* - Branded types for server names
|
|
26
|
+
* - Better error aggregation
|
|
27
|
+
*/
|
|
28
|
+
export declare class MCPConfigLoader {
|
|
29
|
+
private hasShownMigrationWarnings;
|
|
30
|
+
/**
|
|
31
|
+
* Load MCP configuration from project settings with validation and auto-migration
|
|
32
|
+
*
|
|
33
|
+
* Returns Result type instead of throwing
|
|
34
|
+
*/
|
|
35
|
+
loadMCPConfig(): Result<MCPConfig, Error>;
|
|
36
|
+
/**
|
|
37
|
+
* Check if a server configuration would hang (e.g., node with empty args)
|
|
38
|
+
* Returns error message if invalid, undefined if valid
|
|
39
|
+
*/
|
|
40
|
+
private checkForHangingConfig;
|
|
41
|
+
/**
|
|
42
|
+
* Process ax-cli servers with auto-migration
|
|
43
|
+
*/
|
|
44
|
+
private processAxCliServers;
|
|
45
|
+
/**
|
|
46
|
+
* Reset migration warning flag (useful for testing)
|
|
47
|
+
*/
|
|
48
|
+
resetMigrationWarnings(): void;
|
|
49
|
+
/**
|
|
50
|
+
* Save MCP configuration
|
|
51
|
+
*/
|
|
52
|
+
saveMCPConfig(config: MCPConfig): Result<void, Error>;
|
|
53
|
+
/**
|
|
54
|
+
* Add MCP server with validation
|
|
55
|
+
*/
|
|
56
|
+
addMCPServer(config: MCPServerConfig): Result<void, Error>;
|
|
57
|
+
/**
|
|
58
|
+
* Remove MCP server
|
|
59
|
+
*/
|
|
60
|
+
removeMCPServer(serverName: ServerName): Result<void, Error>;
|
|
61
|
+
/**
|
|
62
|
+
* Get MCP server by name
|
|
63
|
+
*/
|
|
64
|
+
getMCPServer(serverName: ServerName): Result<MCPServerConfig, Error>;
|
|
65
|
+
/**
|
|
66
|
+
* Get all configured servers
|
|
67
|
+
*
|
|
68
|
+
* Phase 2: Returns Result type
|
|
69
|
+
*/
|
|
70
|
+
getAllServers(): Result<MCPServerConfig[], Error>;
|
|
71
|
+
/**
|
|
72
|
+
* Get all server names
|
|
73
|
+
*
|
|
74
|
+
* Phase 2: Returns branded types
|
|
75
|
+
*/
|
|
76
|
+
getAllServerNames(): Result<ServerName[], Error>;
|
|
77
|
+
/**
|
|
78
|
+
* Phase 2: Get non-empty list of servers
|
|
79
|
+
* Uses phantom types to prove list is non-empty
|
|
80
|
+
*/
|
|
81
|
+
getNonEmptyServers(): Result<NonEmptyArray<MCPServerConfig>, Error>;
|
|
82
|
+
/**
|
|
83
|
+
* Type-safe method wrappers for tests
|
|
84
|
+
* These mirror the exported functions but as instance methods
|
|
85
|
+
*/
|
|
86
|
+
getMCPServerSafe(serverName: string): Result<MCPServerConfig, Error>;
|
|
87
|
+
addMCPServerSafe(config: MCPServerConfig): Result<void, Error>;
|
|
88
|
+
removeMCPServerSafe(serverName: string): Result<void, Error>;
|
|
89
|
+
getNonEmptyServersSafe(): Result<NonEmptyArray<MCPServerConfig>, Error>;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Legacy function exports that wrap the class methods
|
|
93
|
+
*/
|
|
94
|
+
export declare function loadMCPConfig(): MCPConfig;
|
|
95
|
+
export declare function resetMigrationWarnings(): void;
|
|
96
|
+
export declare function saveMCPConfig(config: MCPConfig): void;
|
|
97
|
+
export declare function addMCPServer(config: MCPServerConfig): void;
|
|
98
|
+
export declare function removeMCPServer(serverName: string): void;
|
|
99
|
+
export declare function getMCPServer(serverName: string): MCPServerConfig | undefined;
|
|
100
|
+
/**
|
|
101
|
+
* New type-safe exports (preferred for new code)
|
|
102
|
+
*/
|
|
103
|
+
export declare function loadMCPConfigSafe(): Result<MCPConfig, Error>;
|
|
104
|
+
export declare function saveMCPConfigSafe(config: MCPConfig): Result<void, Error>;
|
|
105
|
+
export declare function addMCPServerSafe(config: MCPServerConfig): Result<void, Error>;
|
|
106
|
+
export declare function removeMCPServerSafe(serverName: ServerName): Result<void, Error>;
|
|
107
|
+
export declare function getMCPServerSafe(serverName: ServerName): Result<MCPServerConfig, Error>;
|
|
108
|
+
export declare function getAllServersSafe(): Result<MCPServerConfig[], Error>;
|
|
109
|
+
export declare function getAllServerNamesSafe(): Result<ServerName[], Error>;
|
|
110
|
+
export declare function getNonEmptyServersSafe(): Result<NonEmptyArray<MCPServerConfig>, Error>;
|
|
111
|
+
export { TEMPLATES as PREDEFINED_SERVERS, getTemplate, hasTemplate, generateConfigFromTemplate } from './templates.js';
|