@defai.digital/ax-cli 3.1.5 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/.ax-cli/memory.json +8 -1
  2. package/README.md +93 -6
  3. package/config/models.yaml +13 -0
  4. package/dist/agent/context-manager.d.ts +5 -5
  5. package/dist/agent/context-manager.js +19 -9
  6. package/dist/agent/context-manager.js.map +1 -1
  7. package/dist/agent/llm-agent.d.ts +0 -2
  8. package/dist/agent/llm-agent.js +7 -50
  9. package/dist/agent/llm-agent.js.map +1 -1
  10. package/dist/agent/subagent.js +2 -1
  11. package/dist/agent/subagent.js.map +1 -1
  12. package/dist/commands/doctor.d.ts +6 -0
  13. package/dist/commands/doctor.js +527 -0
  14. package/dist/commands/doctor.js.map +1 -0
  15. package/dist/commands/frontend.d.ts +9 -0
  16. package/dist/commands/frontend.js +645 -0
  17. package/dist/commands/frontend.js.map +1 -0
  18. package/dist/commands/mcp.js +409 -3
  19. package/dist/commands/mcp.js.map +1 -1
  20. package/dist/commands/models.js +2 -2
  21. package/dist/commands/models.js.map +1 -1
  22. package/dist/commands/setup.js +15 -13
  23. package/dist/commands/setup.js.map +1 -1
  24. package/dist/constants.d.ts +1 -0
  25. package/dist/constants.js +1 -0
  26. package/dist/constants.js.map +1 -1
  27. package/dist/hooks/use-enhanced-input.js +16 -3
  28. package/dist/hooks/use-enhanced-input.js.map +1 -1
  29. package/dist/hooks/use-input-handler.d.ts +5 -1
  30. package/dist/hooks/use-input-handler.js +118 -31
  31. package/dist/hooks/use-input-handler.js.map +1 -1
  32. package/dist/index.js +29 -5
  33. package/dist/index.js.map +1 -1
  34. package/dist/llm/client.d.ts +1 -0
  35. package/dist/llm/types.d.ts +49 -22
  36. package/dist/llm/types.js +12 -8
  37. package/dist/llm/types.js.map +1 -1
  38. package/dist/mcp/config.d.ts +1 -1
  39. package/dist/mcp/config.js +2 -2
  40. package/dist/mcp/config.js.map +1 -1
  41. package/dist/mcp/health.d.ts +111 -0
  42. package/dist/mcp/health.js +244 -0
  43. package/dist/mcp/health.js.map +1 -0
  44. package/dist/mcp/templates.d.ts +52 -0
  45. package/dist/mcp/templates.js +624 -0
  46. package/dist/mcp/templates.js.map +1 -0
  47. package/dist/schemas/api-schemas.d.ts +2 -1
  48. package/dist/schemas/api-schemas.js +6 -4
  49. package/dist/schemas/api-schemas.js.map +1 -1
  50. package/dist/schemas/settings-schemas.d.ts +14 -0
  51. package/dist/schemas/settings-schemas.js +10 -0
  52. package/dist/schemas/settings-schemas.js.map +1 -1
  53. package/dist/tools/bash.js +25 -10
  54. package/dist/tools/bash.js.map +1 -1
  55. package/dist/ui/components/api-key-input.js +2 -2
  56. package/dist/ui/components/api-key-input.js.map +1 -1
  57. package/dist/ui/components/chat-history.js +14 -7
  58. package/dist/ui/components/chat-history.js.map +1 -1
  59. package/dist/ui/components/chat-input.js +12 -7
  60. package/dist/ui/components/chat-input.js.map +1 -1
  61. package/dist/ui/components/chat-interface.js +64 -53
  62. package/dist/ui/components/chat-interface.js.map +1 -1
  63. package/dist/ui/components/keyboard-hints.js +3 -2
  64. package/dist/ui/components/keyboard-hints.js.map +1 -1
  65. package/dist/ui/components/quick-actions.js +1 -0
  66. package/dist/ui/components/quick-actions.js.map +1 -1
  67. package/dist/ui/components/reasoning-display.js +14 -4
  68. package/dist/ui/components/reasoning-display.js.map +1 -1
  69. package/dist/ui/components/toast-notification.d.ts +29 -0
  70. package/dist/ui/components/toast-notification.js +15 -1
  71. package/dist/ui/components/toast-notification.js.map +1 -1
  72. package/dist/ui/components/welcome-panel.js +21 -2
  73. package/dist/ui/components/welcome-panel.js.map +1 -1
  74. package/dist/utils/config-loader.d.ts +1 -0
  75. package/dist/utils/config-loader.js.map +1 -1
  76. package/dist/utils/settings-manager.d.ts +21 -1
  77. package/dist/utils/settings-manager.js +67 -0
  78. package/dist/utils/settings-manager.js.map +1 -1
  79. package/dist/utils/setup-validator.js +1 -0
  80. package/dist/utils/setup-validator.js.map +1 -1
  81. package/dist/utils/text-utils.d.ts +1 -0
  82. package/dist/utils/text-utils.js +12 -0
  83. package/dist/utils/text-utils.js.map +1 -1
  84. package/package.json +1 -2
  85. package/vitest.config.ts +1 -0
@@ -10,4 +10,4 @@ export declare function saveMCPConfig(config: MCPConfig): void;
10
10
  export declare function addMCPServer(config: MCPServerConfig): void;
11
11
  export declare function removeMCPServer(serverName: string): void;
12
12
  export declare function getMCPServer(serverName: string): MCPServerConfig | undefined;
13
- export declare const PREDEFINED_SERVERS: Record<string, MCPServerConfig>;
13
+ export { TEMPLATES as PREDEFINED_SERVERS, getTemplate, hasTemplate, generateConfigFromTemplate } from './templates.js';
@@ -61,6 +61,6 @@ export function getMCPServer(serverName) {
61
61
  const projectSettings = manager.loadProjectSettings();
62
62
  return projectSettings.mcpServers?.[serverName];
63
63
  }
64
- // Predefined server configurations
65
- export const PREDEFINED_SERVERS = {};
64
+ // Import templates
65
+ export { TEMPLATES as PREDEFINED_SERVERS, getTemplate, hasTemplate, generateConfigFromTemplate } from './templates.js';
66
66
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * MCP Server Health Monitoring
3
+ *
4
+ * Provides health checking, status monitoring, and automatic reconnection
5
+ * for MCP servers.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ import type { MCPManager } from './client.js';
9
+ /**
10
+ * Health status for an MCP server
11
+ */
12
+ export interface ServerHealth {
13
+ /** Server name */
14
+ serverName: string;
15
+ /** Connection status */
16
+ connected: boolean;
17
+ /** Number of available tools */
18
+ toolCount: number;
19
+ /** Server uptime in milliseconds */
20
+ uptime?: number;
21
+ /** Connection start time */
22
+ connectedAt?: number;
23
+ /** Last successful call timestamp */
24
+ lastSuccess?: number;
25
+ /** Last error message */
26
+ lastError?: string;
27
+ /** Last error timestamp */
28
+ lastErrorAt?: number;
29
+ /** Total number of successful tool calls */
30
+ successCount: number;
31
+ /** Total number of failed tool calls */
32
+ failureCount: number;
33
+ /** Average latency in milliseconds */
34
+ avgLatency?: number;
35
+ /** P95 latency in milliseconds */
36
+ p95Latency?: number;
37
+ /** Success rate percentage (0-100) */
38
+ successRate: number;
39
+ }
40
+ /**
41
+ * Health check event types
42
+ */
43
+ export interface HealthCheckEvents {
44
+ 'health-check': (health: ServerHealth) => void;
45
+ 'server-disconnected': (serverName: string) => void;
46
+ 'server-reconnected': (serverName: string) => void;
47
+ 'health-check-error': (serverName: string, error: Error) => void;
48
+ }
49
+ /**
50
+ * MCP Health Monitor
51
+ *
52
+ * Monitors the health of MCP servers and provides automatic reconnection
53
+ */
54
+ export declare class MCPHealthMonitor extends EventEmitter {
55
+ private mcpManager;
56
+ private healthCheckInterval;
57
+ private serverStats;
58
+ constructor(mcpManager: MCPManager);
59
+ /**
60
+ * Start health monitoring with specified interval
61
+ */
62
+ start(intervalMs?: number): void;
63
+ /**
64
+ * Stop health monitoring
65
+ */
66
+ stop(): void;
67
+ /**
68
+ * Perform health checks on all servers
69
+ */
70
+ private performHealthChecks;
71
+ /**
72
+ * Check health of a specific server
73
+ */
74
+ checkServerHealth(serverName: string): Promise<ServerHealth>;
75
+ /**
76
+ * Record a successful tool call
77
+ */
78
+ recordSuccess(serverName: string, latencyMs: number): void;
79
+ /**
80
+ * Record a failed tool call
81
+ */
82
+ recordFailure(serverName: string, error: string): void;
83
+ /**
84
+ * Attempt to reconnect to a disconnected server
85
+ */
86
+ private attemptReconnection;
87
+ /**
88
+ * Calculate percentile from array of values
89
+ */
90
+ private calculatePercentile;
91
+ /**
92
+ * Get health report for all servers
93
+ */
94
+ getHealthReport(): Promise<ServerHealth[]>;
95
+ /**
96
+ * Get health status for a specific server
97
+ */
98
+ getServerStatus(serverName: string): Promise<ServerHealth | null>;
99
+ /**
100
+ * Reset stats for a server
101
+ */
102
+ resetStats(serverName: string): void;
103
+ /**
104
+ * Get formatted uptime string
105
+ */
106
+ static formatUptime(uptimeMs: number): string;
107
+ /**
108
+ * Get formatted latency string
109
+ */
110
+ static formatLatency(latencyMs: number): string;
111
+ }
@@ -0,0 +1,244 @@
1
+ /**
2
+ * MCP Server Health Monitoring
3
+ *
4
+ * Provides health checking, status monitoring, and automatic reconnection
5
+ * for MCP servers.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ /**
9
+ * MCP Health Monitor
10
+ *
11
+ * Monitors the health of MCP servers and provides automatic reconnection
12
+ */
13
+ export class MCPHealthMonitor extends EventEmitter {
14
+ mcpManager;
15
+ healthCheckInterval = null;
16
+ serverStats = new Map();
17
+ constructor(mcpManager) {
18
+ super();
19
+ this.mcpManager = mcpManager;
20
+ }
21
+ /**
22
+ * Start health monitoring with specified interval
23
+ */
24
+ start(intervalMs = 60000) {
25
+ if (this.healthCheckInterval) {
26
+ throw new Error('Health monitoring already started');
27
+ }
28
+ // Initialize stats for existing servers
29
+ const servers = this.mcpManager.getServers();
30
+ for (const serverName of servers) {
31
+ if (!this.serverStats.has(serverName)) {
32
+ this.serverStats.set(serverName, {
33
+ connectedAt: Date.now(),
34
+ successCount: 0,
35
+ failureCount: 0,
36
+ latencies: [],
37
+ });
38
+ }
39
+ }
40
+ this.healthCheckInterval = setInterval(async () => {
41
+ await this.performHealthChecks();
42
+ }, intervalMs);
43
+ }
44
+ /**
45
+ * Stop health monitoring
46
+ */
47
+ stop() {
48
+ if (this.healthCheckInterval) {
49
+ clearInterval(this.healthCheckInterval);
50
+ this.healthCheckInterval = null;
51
+ }
52
+ }
53
+ /**
54
+ * Perform health checks on all servers
55
+ */
56
+ async performHealthChecks() {
57
+ const servers = this.mcpManager.getServers();
58
+ for (const serverName of servers) {
59
+ try {
60
+ const health = await this.checkServerHealth(serverName);
61
+ this.emit('health-check', health);
62
+ // Check if server is unhealthy
63
+ if (!health.connected && health.successRate < 50) {
64
+ this.emit('server-disconnected', serverName);
65
+ await this.attemptReconnection(serverName);
66
+ }
67
+ }
68
+ catch (error) {
69
+ this.emit('health-check-error', serverName, error);
70
+ }
71
+ }
72
+ }
73
+ /**
74
+ * Check health of a specific server
75
+ */
76
+ async checkServerHealth(serverName) {
77
+ const tools = this.mcpManager.getTools().filter((t) => t.serverName === serverName);
78
+ // Initialize stats if not present
79
+ if (!this.serverStats.has(serverName)) {
80
+ this.serverStats.set(serverName, {
81
+ connectedAt: Date.now(),
82
+ successCount: 0,
83
+ failureCount: 0,
84
+ latencies: [],
85
+ });
86
+ }
87
+ const stats = this.serverStats.get(serverName);
88
+ // Calculate success rate
89
+ const total = stats.successCount + stats.failureCount;
90
+ const successRate = total > 0 ? (stats.successCount / total) * 100 : 100;
91
+ // Calculate latencies
92
+ const avgLatency = stats.latencies.length > 0
93
+ ? stats.latencies.reduce((a, b) => a + b, 0) / stats.latencies.length
94
+ : undefined;
95
+ const p95Latency = stats.latencies.length > 0
96
+ ? this.calculatePercentile(stats.latencies, 0.95)
97
+ : undefined;
98
+ // Calculate uptime
99
+ const uptime = Date.now() - stats.connectedAt;
100
+ return {
101
+ serverName,
102
+ connected: tools.length > 0,
103
+ toolCount: tools.length,
104
+ uptime,
105
+ connectedAt: stats.connectedAt,
106
+ lastSuccess: stats.lastSuccess,
107
+ lastError: stats.lastError,
108
+ lastErrorAt: stats.lastErrorAt,
109
+ successCount: stats.successCount,
110
+ failureCount: stats.failureCount,
111
+ avgLatency,
112
+ p95Latency,
113
+ successRate,
114
+ };
115
+ }
116
+ /**
117
+ * Record a successful tool call
118
+ */
119
+ recordSuccess(serverName, latencyMs) {
120
+ // Initialize stats if not present
121
+ if (!this.serverStats.has(serverName)) {
122
+ this.serverStats.set(serverName, {
123
+ connectedAt: Date.now(),
124
+ successCount: 0,
125
+ failureCount: 0,
126
+ latencies: [],
127
+ });
128
+ }
129
+ const stats = this.serverStats.get(serverName);
130
+ stats.successCount++;
131
+ stats.lastSuccess = Date.now();
132
+ stats.latencies.push(latencyMs);
133
+ // Keep only last 100 latencies
134
+ if (stats.latencies.length > 100) {
135
+ stats.latencies.shift();
136
+ }
137
+ }
138
+ /**
139
+ * Record a failed tool call
140
+ */
141
+ recordFailure(serverName, error) {
142
+ // Initialize stats if not present
143
+ if (!this.serverStats.has(serverName)) {
144
+ this.serverStats.set(serverName, {
145
+ connectedAt: Date.now(),
146
+ successCount: 0,
147
+ failureCount: 0,
148
+ latencies: [],
149
+ });
150
+ }
151
+ const stats = this.serverStats.get(serverName);
152
+ stats.failureCount++;
153
+ stats.lastError = error;
154
+ stats.lastErrorAt = Date.now();
155
+ }
156
+ /**
157
+ * Attempt to reconnect to a disconnected server
158
+ */
159
+ async attemptReconnection(serverName) {
160
+ try {
161
+ // Get server configuration (if available)
162
+ // Note: This would require extending MCPManager to expose config
163
+ // For now, we just emit an event
164
+ this.emit('server-reconnected', serverName);
165
+ }
166
+ catch (error) {
167
+ this.emit('health-check-error', serverName, error);
168
+ }
169
+ }
170
+ /**
171
+ * Calculate percentile from array of values
172
+ */
173
+ calculatePercentile(values, percentile) {
174
+ const sorted = [...values].sort((a, b) => a - b);
175
+ const index = Math.ceil(sorted.length * percentile) - 1;
176
+ return sorted[index] || 0;
177
+ }
178
+ /**
179
+ * Get health report for all servers
180
+ */
181
+ async getHealthReport() {
182
+ const servers = this.mcpManager.getServers();
183
+ const report = [];
184
+ for (const serverName of servers) {
185
+ const health = await this.checkServerHealth(serverName);
186
+ report.push(health);
187
+ }
188
+ return report;
189
+ }
190
+ /**
191
+ * Get health status for a specific server
192
+ */
193
+ async getServerStatus(serverName) {
194
+ const servers = this.mcpManager.getServers();
195
+ if (!servers.includes(serverName)) {
196
+ return null;
197
+ }
198
+ return await this.checkServerHealth(serverName);
199
+ }
200
+ /**
201
+ * Reset stats for a server
202
+ */
203
+ resetStats(serverName) {
204
+ this.serverStats.set(serverName, {
205
+ connectedAt: Date.now(),
206
+ successCount: 0,
207
+ failureCount: 0,
208
+ latencies: [],
209
+ });
210
+ }
211
+ /**
212
+ * Get formatted uptime string
213
+ */
214
+ static formatUptime(uptimeMs) {
215
+ const seconds = Math.floor(uptimeMs / 1000);
216
+ const minutes = Math.floor(seconds / 60);
217
+ const hours = Math.floor(minutes / 60);
218
+ const days = Math.floor(hours / 24);
219
+ if (days > 0) {
220
+ return `${days}d ${hours % 24}h`;
221
+ }
222
+ else if (hours > 0) {
223
+ return `${hours}h ${minutes % 60}m`;
224
+ }
225
+ else if (minutes > 0) {
226
+ return `${minutes}m ${seconds % 60}s`;
227
+ }
228
+ else {
229
+ return `${seconds}s`;
230
+ }
231
+ }
232
+ /**
233
+ * Get formatted latency string
234
+ */
235
+ static formatLatency(latencyMs) {
236
+ if (latencyMs < 1000) {
237
+ return `${Math.round(latencyMs)}ms`;
238
+ }
239
+ else {
240
+ return `${(latencyMs / 1000).toFixed(2)}s`;
241
+ }
242
+ }
243
+ }
244
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/mcp/health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Pre-configured MCP server templates for popular services
3
+ * Enables one-command setup: ax-cli mcp add <name> --template
4
+ */
5
+ import { MCPServerConfig } from '../schemas/settings-schemas.js';
6
+ export interface MCPServerTemplate {
7
+ name: string;
8
+ description: string;
9
+ category: 'design' | 'deployment' | 'testing' | 'monitoring' | 'backend' | 'version-control';
10
+ officialServer: boolean;
11
+ config: MCPServerConfig;
12
+ requiredEnv: Array<{
13
+ name: string;
14
+ description: string;
15
+ url?: string;
16
+ }>;
17
+ setupInstructions: string;
18
+ usageExamples: string[];
19
+ troubleshooting: Array<{
20
+ issue: string;
21
+ solution: string;
22
+ }>;
23
+ }
24
+ /**
25
+ * Pre-configured templates for popular MCP servers
26
+ * Focus on front-end development tools
27
+ */
28
+ export declare const TEMPLATES: Record<string, MCPServerTemplate>;
29
+ /**
30
+ * Get all available template names
31
+ */
32
+ export declare function getTemplateNames(): string[];
33
+ /**
34
+ * Get template by name
35
+ */
36
+ export declare function getTemplate(name: string): MCPServerTemplate | undefined;
37
+ /**
38
+ * Get templates by category
39
+ */
40
+ export declare function getTemplatesByCategory(category: MCPServerTemplate['category']): MCPServerTemplate[];
41
+ /**
42
+ * Search templates by keyword
43
+ */
44
+ export declare function searchTemplates(query: string): MCPServerTemplate[];
45
+ /**
46
+ * Check if a template exists
47
+ */
48
+ export declare function hasTemplate(name: string): boolean;
49
+ /**
50
+ * Generate MCP config from template with environment variables
51
+ */
52
+ export declare function generateConfigFromTemplate(templateName: string, envVars: Record<string, string>): MCPServerConfig;