@defai.digital/ax-cli 3.7.1 → 3.8.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 +143 -56
- package/dist/agent/context-manager.d.ts +15 -1
- package/dist/agent/context-manager.js +50 -19
- package/dist/agent/context-manager.js.map +1 -1
- package/dist/agent/dependency-resolver.js +13 -7
- package/dist/agent/dependency-resolver.js.map +1 -1
- package/dist/agent/llm-agent.d.ts +35 -0
- package/dist/agent/llm-agent.js +137 -4
- package/dist/agent/llm-agent.js.map +1 -1
- package/dist/agent/status-reporter.d.ts +114 -0
- package/dist/agent/status-reporter.js +335 -0
- package/dist/agent/status-reporter.js.map +1 -0
- package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js +8 -2
- package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js.map +1 -1
- package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js +3 -1
- package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js.map +1 -1
- package/dist/analyzers/best-practices/rules/typescript/prefer-const.js +3 -1
- package/dist/analyzers/best-practices/rules/typescript/prefer-const.js.map +1 -1
- package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js +3 -1
- package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js.map +1 -1
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js +9 -3
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js.map +1 -1
- package/dist/analyzers/git/churn-calculator.d.ts +1 -0
- package/dist/analyzers/git/churn-calculator.js +25 -6
- package/dist/analyzers/git/churn-calculator.js.map +1 -1
- package/dist/analyzers/git/hotspot-detector.js +2 -2
- package/dist/analyzers/git/hotspot-detector.js.map +1 -1
- package/dist/analyzers/metrics/metrics-analyzer.js +1 -1
- package/dist/analyzers/metrics/metrics-analyzer.js.map +1 -1
- package/dist/analyzers/security/security-analyzer.js +1 -1
- package/dist/analyzers/security/security-analyzer.js.map +1 -1
- package/dist/checkpoint/manager.d.ts +1 -0
- package/dist/checkpoint/manager.js +49 -9
- package/dist/checkpoint/manager.js.map +1 -1
- package/dist/checkpoint/storage.js +2 -2
- package/dist/checkpoint/storage.js.map +1 -1
- package/dist/commands/mcp-migrate.d.ts +9 -0
- package/dist/commands/mcp-migrate.js +172 -0
- package/dist/commands/mcp-migrate.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.js +211 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/vscode.d.ts +7 -0
- package/dist/commands/vscode.js +363 -0
- package/dist/commands/vscode.js.map +1 -0
- package/dist/index.js +79 -30
- package/dist/index.js.map +1 -1
- package/dist/llm/client.js +22 -4
- package/dist/llm/client.js.map +1 -1
- package/dist/mcp/automatosx-loader.d.ts +84 -0
- package/dist/mcp/automatosx-loader.js +238 -0
- package/dist/mcp/automatosx-loader.js.map +1 -0
- package/dist/mcp/client-mutex-patch.d.ts +36 -0
- package/dist/mcp/client-mutex-patch.js +75 -0
- package/dist/mcp/client-mutex-patch.js.map +1 -0
- package/dist/mcp/client-v2.d.ts +229 -0
- package/dist/mcp/client-v2.js +740 -0
- package/dist/mcp/client-v2.js.map +1 -0
- package/dist/mcp/client.d.ts +111 -13
- package/dist/mcp/client.js +168 -253
- package/dist/mcp/client.js.map +1 -1
- 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-detector.d.ts +90 -0
- package/dist/mcp/config-detector.js +242 -0
- package/dist/mcp/config-detector.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-migrator.d.ts +63 -0
- package/dist/mcp/config-migrator.js +269 -0
- package/dist/mcp/config-migrator.js.map +1 -0
- package/dist/mcp/config-v2.d.ts +106 -0
- package/dist/mcp/config-v2.js +417 -0
- package/dist/mcp/config-v2.js.map +1 -0
- package/dist/mcp/config.d.ts +12 -1
- package/dist/mcp/config.js +95 -10
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/error-formatter.d.ts +46 -0
- package/dist/mcp/error-formatter.js +244 -0
- package/dist/mcp/error-formatter.js.map +1 -0
- package/dist/mcp/health.d.ts +5 -0
- package/dist/mcp/health.js +22 -2
- package/dist/mcp/health.js.map +1 -1
- package/dist/mcp/invariants.d.ts +141 -0
- package/dist/mcp/invariants.js +243 -0
- package/dist/mcp/invariants.js.map +1 -0
- package/dist/mcp/mutex-safe.d.ts +153 -0
- package/dist/mcp/mutex-safe.js +260 -0
- package/dist/mcp/mutex-safe.js.map +1 -0
- package/dist/mcp/mutex.d.ts +73 -0
- package/dist/mcp/mutex.js +130 -0
- package/dist/mcp/mutex.js.map +1 -0
- package/dist/mcp/reconnection.d.ts +4 -0
- package/dist/mcp/reconnection.js +15 -0
- package/dist/mcp/reconnection.js.map +1 -1
- 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/mcp/type-safety.d.ts +231 -0
- package/dist/mcp/type-safety.js +273 -0
- package/dist/mcp/type-safety.js.map +1 -0
- package/dist/planner/task-planner.js +13 -0
- package/dist/planner/task-planner.js.map +1 -1
- package/dist/planner/types.d.ts +6 -6
- package/dist/schemas/confirmation-schemas.d.ts +2 -2
- package/dist/schemas/settings-schemas.d.ts +196 -0
- package/dist/schemas/settings-schemas.js +146 -5
- package/dist/schemas/settings-schemas.js.map +1 -1
- package/dist/sdk/index.d.ts +118 -2
- package/dist/sdk/index.js +146 -4
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/testing.d.ts +182 -0
- package/dist/sdk/testing.js +231 -0
- package/dist/sdk/testing.js.map +1 -1
- package/dist/sdk/version.d.ts +114 -15
- package/dist/sdk/version.js +137 -15
- package/dist/sdk/version.js.map +1 -1
- package/dist/tools/bash.js +54 -9
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/registry.d.ts +146 -0
- package/dist/tools/registry.js +170 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search.js +12 -2
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/text-editor.js +84 -26
- package/dist/tools/text-editor.js.map +1 -1
- package/dist/ui/components/chat-history.js +6 -1
- package/dist/ui/components/chat-history.js.map +1 -1
- package/dist/ui/components/chat-input.d.ts +2 -1
- package/dist/ui/components/chat-input.js +5 -2
- package/dist/ui/components/chat-input.js.map +1 -1
- package/dist/ui/components/chat-interface.js +187 -5
- package/dist/ui/components/chat-interface.js.map +1 -1
- package/dist/ui/components/context-breakdown.d.ts +23 -0
- package/dist/ui/components/context-breakdown.js +124 -0
- package/dist/ui/components/context-breakdown.js.map +1 -0
- package/dist/ui/components/keyboard-help.d.ts +17 -0
- package/dist/ui/components/keyboard-help.js +116 -0
- package/dist/ui/components/keyboard-help.js.map +1 -0
- package/dist/ui/components/keyboard-hints.js +2 -2
- package/dist/ui/components/keyboard-hints.js.map +1 -1
- package/dist/ui/components/quick-actions.js +43 -7
- package/dist/ui/components/quick-actions.js.map +1 -1
- package/dist/ui/components/status-bar.d.ts +3 -0
- package/dist/ui/components/status-bar.js +25 -16
- package/dist/ui/components/status-bar.js.map +1 -1
- package/dist/ui/components/toast-notification.d.ts +42 -0
- package/dist/ui/components/toast-notification.js +30 -2
- package/dist/ui/components/toast-notification.js.map +1 -1
- package/dist/ui/components/tool-group-display.js +34 -4
- package/dist/ui/components/tool-group-display.js.map +1 -1
- package/dist/ui/components/welcome-panel.js +2 -2
- package/dist/ui/components/welcome-panel.js.map +1 -1
- package/dist/ui/hooks/use-enhanced-input.d.ts +9 -1
- package/dist/ui/hooks/use-enhanced-input.js +486 -41
- package/dist/ui/hooks/use-enhanced-input.js.map +1 -1
- package/dist/ui/hooks/use-input-handler.d.ts +11 -1
- package/dist/ui/hooks/use-input-handler.js +67 -3
- package/dist/ui/hooks/use-input-handler.js.map +1 -1
- package/dist/ui/hooks/use-input-history.d.ts +1 -1
- package/dist/ui/hooks/use-input-history.js +50 -14
- package/dist/ui/hooks/use-input-history.js.map +1 -1
- package/dist/ui/utils/bracketed-paste-handler.d.ts +97 -0
- package/dist/ui/utils/bracketed-paste-handler.js +322 -0
- package/dist/ui/utils/bracketed-paste-handler.js.map +1 -0
- package/dist/ui/utils/change-summarizer.js +16 -6
- package/dist/ui/utils/change-summarizer.js.map +1 -1
- package/dist/ui/utils/tool-grouper.d.ts +10 -1
- package/dist/ui/utils/tool-grouper.js +143 -30
- package/dist/ui/utils/tool-grouper.js.map +1 -1
- package/dist/utils/auto-accept-logger.d.ts +173 -0
- package/dist/utils/auto-accept-logger.js +420 -0
- package/dist/utils/auto-accept-logger.js.map +1 -0
- package/dist/utils/background-task-manager.d.ts +11 -0
- package/dist/utils/background-task-manager.js +124 -38
- package/dist/utils/background-task-manager.js.map +1 -1
- package/dist/utils/confirmation-service.d.ts +1 -0
- package/dist/utils/confirmation-service.js +6 -1
- package/dist/utils/confirmation-service.js.map +1 -1
- package/dist/utils/encryption.d.ts +8 -0
- package/dist/utils/encryption.js +44 -27
- package/dist/utils/encryption.js.map +1 -1
- package/dist/utils/enhanced-error-messages.d.ts +33 -0
- package/dist/utils/enhanced-error-messages.js +420 -0
- package/dist/utils/enhanced-error-messages.js.map +1 -0
- package/dist/utils/error-handler.d.ts +13 -3
- package/dist/utils/error-handler.js +16 -4
- package/dist/utils/error-handler.js.map +1 -1
- package/dist/utils/external-editor.d.ts +47 -0
- package/dist/utils/external-editor.js +179 -0
- package/dist/utils/external-editor.js.map +1 -0
- package/dist/utils/history-migration.d.ts +9 -0
- package/dist/utils/history-migration.js +36 -0
- package/dist/utils/history-migration.js.map +1 -0
- package/dist/utils/paste-utils.js +12 -11
- package/dist/utils/paste-utils.js.map +1 -1
- package/dist/utils/rate-limiter.js +7 -0
- package/dist/utils/rate-limiter.js.map +1 -1
- package/dist/utils/safety-rules.d.ts +64 -0
- package/dist/utils/safety-rules.js +225 -0
- package/dist/utils/safety-rules.js.map +1 -0
- package/dist/utils/settings-manager.d.ts +89 -1
- package/dist/utils/settings-manager.js +359 -3
- package/dist/utils/settings-manager.js.map +1 -1
- package/dist/utils/token-counter.d.ts +2 -0
- package/dist/utils/token-counter.js +17 -4
- package/dist/utils/token-counter.js.map +1 -1
- package/dist/utils/version.d.ts +11 -2
- package/dist/utils/version.js +54 -21
- package/dist/utils/version.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Configuration Format Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects and validates MCP server configurations, including legacy formats
|
|
5
|
+
* from AutomatosX and older ax-cli versions.
|
|
6
|
+
*/
|
|
7
|
+
import { MCPServerConfigSchema } from '../schemas/settings-schemas.js';
|
|
8
|
+
/**
|
|
9
|
+
* Detect if a config is in legacy stdio-only format
|
|
10
|
+
*
|
|
11
|
+
* Legacy format:
|
|
12
|
+
* {
|
|
13
|
+
* "name": "server",
|
|
14
|
+
* "command": "npx",
|
|
15
|
+
* "args": ["..."],
|
|
16
|
+
* "env": { ... }
|
|
17
|
+
* }
|
|
18
|
+
*
|
|
19
|
+
* Modern format:
|
|
20
|
+
* {
|
|
21
|
+
* "name": "server",
|
|
22
|
+
* "transport": {
|
|
23
|
+
* "type": "stdio",
|
|
24
|
+
* "command": "npx",
|
|
25
|
+
* "args": ["..."],
|
|
26
|
+
* "env": { ... }
|
|
27
|
+
* }
|
|
28
|
+
* }
|
|
29
|
+
*/
|
|
30
|
+
export function isLegacyStdioFormat(config) {
|
|
31
|
+
if (!config || typeof config !== 'object') {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
// Legacy format requires: command AND args AND no transport
|
|
35
|
+
const hasCommand = typeof config.command === 'string' && config.command.length > 0;
|
|
36
|
+
const hasArgs = Array.isArray(config.args);
|
|
37
|
+
const hasTransport = config.transport !== undefined;
|
|
38
|
+
return hasCommand && hasArgs && !hasTransport;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Detect if config is from AutomatosX
|
|
42
|
+
*
|
|
43
|
+
* AutomatosX configs typically:
|
|
44
|
+
* - Have env field (even if modern format)
|
|
45
|
+
* - Use legacy format (pre-v8.0)
|
|
46
|
+
* - Have specific naming patterns
|
|
47
|
+
* - May include AutomatosX-specific metadata
|
|
48
|
+
*/
|
|
49
|
+
export function isAutomatosXConfig(config) {
|
|
50
|
+
if (!config || typeof config !== 'object') {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
// Check for AutomatosX-specific markers
|
|
54
|
+
const hasAutomatosXMetadata = !!(config._automatosX ||
|
|
55
|
+
config.automatosxVersion ||
|
|
56
|
+
config.source === 'automatosx');
|
|
57
|
+
// AutomatosX configs often have env field at root level (even in modern format)
|
|
58
|
+
const hasRootEnv = !!(config.env && typeof config.env === 'object');
|
|
59
|
+
return hasAutomatosXMetadata || hasRootEnv;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Comprehensive config detection
|
|
63
|
+
*/
|
|
64
|
+
export function detectConfigFormat(config) {
|
|
65
|
+
const issues = [];
|
|
66
|
+
const warnings = [];
|
|
67
|
+
let formatVersion = 'unknown';
|
|
68
|
+
let transportType;
|
|
69
|
+
// Validate basic structure
|
|
70
|
+
if (!config || typeof config !== 'object') {
|
|
71
|
+
issues.push('Config must be an object');
|
|
72
|
+
return {
|
|
73
|
+
isValid: false,
|
|
74
|
+
isLegacy: false,
|
|
75
|
+
isAutomatosX: false,
|
|
76
|
+
formatVersion: 'unknown',
|
|
77
|
+
transportType: undefined,
|
|
78
|
+
issues,
|
|
79
|
+
warnings,
|
|
80
|
+
originalConfig: config
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// Check for required name field
|
|
84
|
+
if (!config.name || typeof config.name !== 'string') {
|
|
85
|
+
issues.push('Server name is required');
|
|
86
|
+
}
|
|
87
|
+
// Detect format version
|
|
88
|
+
const isLegacy = isLegacyStdioFormat(config);
|
|
89
|
+
const isAutomatosX = isAutomatosXConfig(config);
|
|
90
|
+
if (isLegacy) {
|
|
91
|
+
formatVersion = 'legacy-stdio';
|
|
92
|
+
transportType = 'stdio'; // Legacy format is always stdio
|
|
93
|
+
issues.push('Legacy stdio format (missing transport wrapper)');
|
|
94
|
+
// Validate legacy format requirements
|
|
95
|
+
if (!config.command) {
|
|
96
|
+
issues.push('Legacy format requires "command" field');
|
|
97
|
+
}
|
|
98
|
+
// Legacy configs don't require args - but we do need command for valid legacy
|
|
99
|
+
if (!config.args || !Array.isArray(config.args)) {
|
|
100
|
+
warnings.push('Missing "args" array. Will use empty array.');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else if (!config.transport) {
|
|
104
|
+
// No transport and not legacy - invalid
|
|
105
|
+
issues.push('Missing transport configuration');
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Has transport - detect type
|
|
109
|
+
transportType = config.transport.type;
|
|
110
|
+
// Try to validate as modern format
|
|
111
|
+
const validationResult = MCPServerConfigSchema.safeParse(config);
|
|
112
|
+
if (validationResult.success) {
|
|
113
|
+
formatVersion = 'v3.6+';
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// Not legacy, not valid modern format
|
|
117
|
+
issues.push('Invalid modern format. Malformed "transport" configuration.');
|
|
118
|
+
// Extract specific validation errors
|
|
119
|
+
if (validationResult.error) {
|
|
120
|
+
validationResult.error.issues.forEach(issue => {
|
|
121
|
+
const field = issue.path.join('.');
|
|
122
|
+
issues.push(`Field "${field}": ${issue.message}`);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Check for AutomatosX-specific issues
|
|
128
|
+
if (isAutomatosX && !isLegacy) {
|
|
129
|
+
warnings.push('AutomatosX config detected but using modern format. This is correct.');
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
isValid: issues.length === 0,
|
|
133
|
+
isLegacy,
|
|
134
|
+
isAutomatosX,
|
|
135
|
+
formatVersion,
|
|
136
|
+
transportType,
|
|
137
|
+
issues,
|
|
138
|
+
warnings,
|
|
139
|
+
originalConfig: config
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Validate a transport configuration
|
|
144
|
+
*/
|
|
145
|
+
export function validateTransportConfig(transport) {
|
|
146
|
+
const errors = [];
|
|
147
|
+
const warnings = [];
|
|
148
|
+
if (!transport || typeof transport !== 'object') {
|
|
149
|
+
errors.push('Transport configuration is required');
|
|
150
|
+
return { isValid: false, errors, warnings };
|
|
151
|
+
}
|
|
152
|
+
// Check transport type
|
|
153
|
+
const validTypes = ['stdio', 'http', 'sse', 'streamable_http'];
|
|
154
|
+
if (!transport.type || !validTypes.includes(transport.type)) {
|
|
155
|
+
errors.push(`Transport type must be one of: ${validTypes.join(', ')}`);
|
|
156
|
+
return { isValid: false, errors, warnings };
|
|
157
|
+
}
|
|
158
|
+
// Type-specific validation
|
|
159
|
+
switch (transport.type) {
|
|
160
|
+
case 'stdio':
|
|
161
|
+
if (!transport.command) {
|
|
162
|
+
errors.push('stdio transport requires command');
|
|
163
|
+
}
|
|
164
|
+
if (!transport.args || !Array.isArray(transport.args)) {
|
|
165
|
+
warnings.push('stdio transport should have "args" array');
|
|
166
|
+
}
|
|
167
|
+
break;
|
|
168
|
+
case 'http':
|
|
169
|
+
case 'sse':
|
|
170
|
+
if (!transport.url) {
|
|
171
|
+
errors.push(`${transport.type} transport requires url`);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
try {
|
|
175
|
+
new URL(transport.url);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
errors.push(`Invalid URL format: ${transport.url}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
break;
|
|
182
|
+
case 'streamable_http':
|
|
183
|
+
warnings.push('streamable_http transport is experimental and may not work with all MCP servers');
|
|
184
|
+
if (!transport.url) {
|
|
185
|
+
errors.push('streamable_http transport requires url');
|
|
186
|
+
}
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
isValid: errors.length === 0,
|
|
191
|
+
errors,
|
|
192
|
+
warnings
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Batch detect multiple configs
|
|
197
|
+
*/
|
|
198
|
+
export function detectMultipleConfigs(configs) {
|
|
199
|
+
if (!configs || typeof configs !== 'object') {
|
|
200
|
+
return [];
|
|
201
|
+
}
|
|
202
|
+
const results = [];
|
|
203
|
+
for (const [name, config] of Object.entries(configs)) {
|
|
204
|
+
// Ensure config has name field
|
|
205
|
+
const configWithName = { ...config, name: config.name || name };
|
|
206
|
+
const result = detectConfigFormat(configWithName);
|
|
207
|
+
results.push({ serverName: name, detection: result });
|
|
208
|
+
}
|
|
209
|
+
return results;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Get summary statistics for batch detection
|
|
213
|
+
*/
|
|
214
|
+
export function getDetectionSummary(results) {
|
|
215
|
+
let valid = 0;
|
|
216
|
+
let legacy = 0;
|
|
217
|
+
let automatosX = 0;
|
|
218
|
+
let needsMigration = 0;
|
|
219
|
+
let hasIssues = 0;
|
|
220
|
+
for (const { detection } of results) {
|
|
221
|
+
if (detection.isValid)
|
|
222
|
+
valid++;
|
|
223
|
+
if (detection.isLegacy) {
|
|
224
|
+
legacy++;
|
|
225
|
+
// Legacy configs always need migration, even if they have issues
|
|
226
|
+
needsMigration++;
|
|
227
|
+
}
|
|
228
|
+
if (detection.isAutomatosX)
|
|
229
|
+
automatosX++;
|
|
230
|
+
if (detection.issues && detection.issues.length > 0)
|
|
231
|
+
hasIssues++;
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
total: results.length,
|
|
235
|
+
valid,
|
|
236
|
+
legacy,
|
|
237
|
+
automatosX,
|
|
238
|
+
needsMigration,
|
|
239
|
+
hasIssues
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=config-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-detector.js","sourceRoot":"","sources":["../../src/mcp/config-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
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 type { MCPServerConfig } from '../schemas/settings-schemas.js';
|
|
13
|
+
import { Result } from './type-safety.js';
|
|
14
|
+
/**
|
|
15
|
+
* Migration result with detailed information
|
|
16
|
+
*/
|
|
17
|
+
export interface MigrationDetails {
|
|
18
|
+
migratedConfig: MCPServerConfig;
|
|
19
|
+
warnings: string[];
|
|
20
|
+
changesApplied: string[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Migration error with context
|
|
24
|
+
*/
|
|
25
|
+
export declare class MigrationError extends Error {
|
|
26
|
+
readonly issues: string[];
|
|
27
|
+
readonly originalConfig: any;
|
|
28
|
+
constructor(message: string, issues: string[], originalConfig: any);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Migrate legacy stdio config to modern format
|
|
32
|
+
*
|
|
33
|
+
* Phase 2: Returns Result type with detailed information
|
|
34
|
+
*/
|
|
35
|
+
export declare function migrateLegacyStdioConfig(config: any): Result<MigrationDetails, MigrationError>;
|
|
36
|
+
/**
|
|
37
|
+
* Migrate any config format to modern format
|
|
38
|
+
*
|
|
39
|
+
* Phase 2: Handles all format types with exhaustiveness checking
|
|
40
|
+
*/
|
|
41
|
+
export declare function migrateConfig(config: any): Result<MigrationDetails, MigrationError>;
|
|
42
|
+
/**
|
|
43
|
+
* Migrate multiple configs
|
|
44
|
+
*
|
|
45
|
+
* Phase 2: Better error aggregation with partial success
|
|
46
|
+
*/
|
|
47
|
+
export interface BatchMigrationResult {
|
|
48
|
+
successful: Array<{
|
|
49
|
+
index: number;
|
|
50
|
+
originalName: string;
|
|
51
|
+
migratedConfig: MCPServerConfig;
|
|
52
|
+
warnings: string[];
|
|
53
|
+
}>;
|
|
54
|
+
failed: Array<{
|
|
55
|
+
index: number;
|
|
56
|
+
originalName: string;
|
|
57
|
+
error: MigrationError;
|
|
58
|
+
}>;
|
|
59
|
+
totalCount: number;
|
|
60
|
+
successCount: number;
|
|
61
|
+
failureCount: number;
|
|
62
|
+
}
|
|
63
|
+
export declare function migrateConfigs(configs: any[]): Result<BatchMigrationResult, Error>;
|
|
64
|
+
/**
|
|
65
|
+
* Create backup of config before migration
|
|
66
|
+
*/
|
|
67
|
+
export declare function createConfigBackup(config: any, backupPath?: string): Result<string, Error>;
|
|
68
|
+
/**
|
|
69
|
+
* Validate migration was successful
|
|
70
|
+
*/
|
|
71
|
+
export declare function validateMigration(original: any, migrated: MCPServerConfig): Result<{
|
|
72
|
+
dataPreserved: boolean;
|
|
73
|
+
issues: string[];
|
|
74
|
+
}, Error>;
|
|
75
|
+
/**
|
|
76
|
+
* Generate migration report
|
|
77
|
+
*/
|
|
78
|
+
export declare function generateMigrationReport(result: BatchMigrationResult): string;
|
|
79
|
+
/**
|
|
80
|
+
* Migrate legacy configs to modern format in batch
|
|
81
|
+
* Convenience function for migrating multiple legacy configs
|
|
82
|
+
*/
|
|
83
|
+
export declare function migrateLegacyToModernBatch(configs: any[]): Result<BatchMigrationResult, Error>;
|
|
84
|
+
/**
|
|
85
|
+
* Revert migration (convert modern back to legacy)
|
|
86
|
+
*
|
|
87
|
+
* Only works for stdio configs
|
|
88
|
+
*/
|
|
89
|
+
export declare function revertMigration(config: MCPServerConfig): Result<any, Error>;
|
|
@@ -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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"}
|