@defai.digital/ax-cli 3.1.5 → 3.2.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.
- package/README.md +85 -4
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.js +527 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/hooks/use-input-handler.d.ts +5 -1
- package/dist/hooks/use-input-handler.js +114 -31
- package/dist/hooks/use-input-handler.js.map +1 -1
- package/dist/index.js +24 -3
- package/dist/index.js.map +1 -1
- package/dist/schemas/settings-schemas.d.ts +14 -0
- package/dist/schemas/settings-schemas.js +10 -0
- package/dist/schemas/settings-schemas.js.map +1 -1
- package/dist/utils/settings-manager.d.ts +21 -1
- package/dist/utils/settings-manager.js +67 -0
- package/dist/utils/settings-manager.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# AX CLI - Enterprise-Class AI CLI
|
|
1
|
+
# AX CLI - Enterprise-Class GLM AI CLI
|
|
2
2
|
|
|
3
3
|
[](https://github.com/defai-digital/ax-cli/actions/workflows/test.yml)
|
|
4
4
|
[](https://github.com/defai-digital/ax-cli)
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|

|
|
14
14
|
|
|
15
15
|
<p align="center">
|
|
16
|
-
<strong>
|
|
16
|
+
<strong>GLM-Optimized CLI • Enterprise Architecture • 98%+ Test Coverage • TypeScript & Zod</strong>
|
|
17
17
|
</p>
|
|
18
18
|
|
|
19
19
|
---
|
|
@@ -36,7 +36,9 @@ ax-cli
|
|
|
36
36
|
|
|
37
37
|
## ✨ Features
|
|
38
38
|
|
|
39
|
-
- **🤖
|
|
39
|
+
- **🤖 GLM-Focused AI CLI**: Optimized for Z.AI's GLM models (glm-4.6, glm-4-air, glm-4-airx)
|
|
40
|
+
- **Note**: For xAI Grok models, use [grok-cli](https://github.com/superagent-ai/grok-cli)
|
|
41
|
+
- **Note**: For Anthropic Claude models, use [claude-code](https://claude.ai/code)
|
|
40
42
|
- **🧠 GLM 4.6 Optimized**: Primary support for General Language Model with advanced reasoning
|
|
41
43
|
- **32K max tokens** (industry-standard, matches Claude Code CLI)
|
|
42
44
|
- 200K context window, 128K max output capability
|
|
@@ -60,6 +62,13 @@ ax-cli
|
|
|
60
62
|
- Automatic project scanning and context generation
|
|
61
63
|
- z.ai implicit caching support (50% token savings on repeated context)
|
|
62
64
|
- Cache statistics tracking and efficiency monitoring
|
|
65
|
+
- **🏥 Health Check** (NEW): Comprehensive diagnostics with `ax-cli doctor`
|
|
66
|
+
- Verify configuration, API connectivity, and dependencies
|
|
67
|
+
- Detailed error messages with actionable suggestions
|
|
68
|
+
- **💬 Dual-Model Mode** (NEW): Use different models for chat vs coding
|
|
69
|
+
- Configure chat and coding models separately
|
|
70
|
+
- Manual model switching with `--chat-mode` flag
|
|
71
|
+
- Optimize cost and performance for different task types
|
|
63
72
|
- **🔄 Auto-Update**: Built-in update checker and installer
|
|
64
73
|
|
|
65
74
|
### Max Tokens Configuration
|
|
@@ -150,6 +159,7 @@ ax-cli -c
|
|
|
150
159
|
/clear # Clear chat history
|
|
151
160
|
/models # Switch AI model
|
|
152
161
|
/usage # Show API usage statistics
|
|
162
|
+
/doctor # Run health check diagnostics
|
|
153
163
|
/tasks # List background tasks
|
|
154
164
|
/task <id> # View background task output
|
|
155
165
|
/kill <id> # Kill a background task
|
|
@@ -328,6 +338,77 @@ ax-cli usage reset
|
|
|
328
338
|
|
|
329
339
|
[CLI Reference →](docs/cli-reference.md) | [Usage Guide →](docs/usage.md)
|
|
330
340
|
|
|
341
|
+
## 🏥 Health Check & Diagnostics (NEW)
|
|
342
|
+
|
|
343
|
+
Run comprehensive diagnostics to verify your AX CLI configuration:
|
|
344
|
+
|
|
345
|
+
```bash
|
|
346
|
+
# Run full diagnostic check
|
|
347
|
+
ax-cli doctor
|
|
348
|
+
|
|
349
|
+
# Get detailed diagnostic information
|
|
350
|
+
ax-cli doctor --verbose
|
|
351
|
+
|
|
352
|
+
# Output results as JSON
|
|
353
|
+
ax-cli doctor --json
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
The `doctor` command checks:
|
|
357
|
+
- ✓ Node.js version (24+)
|
|
358
|
+
- ✓ Configuration files (user and project)
|
|
359
|
+
- ✓ API key and base URL
|
|
360
|
+
- ✓ API connectivity and authentication
|
|
361
|
+
- ✓ Model configuration
|
|
362
|
+
- ✓ MCP server configuration
|
|
363
|
+
- ✓ Dependencies (ripgrep, git)
|
|
364
|
+
|
|
365
|
+
## 💬 Dual-Model Mode (NEW)
|
|
366
|
+
|
|
367
|
+
Use different models for chat vs coding tasks to optimize performance and cost:
|
|
368
|
+
|
|
369
|
+
### Configuration
|
|
370
|
+
|
|
371
|
+
Add to `~/.ax-cli/config.json` or `.ax-cli/settings.json`:
|
|
372
|
+
|
|
373
|
+
```json
|
|
374
|
+
{
|
|
375
|
+
"dualModel": {
|
|
376
|
+
"enabled": true,
|
|
377
|
+
"chatModel": "glm-4-air",
|
|
378
|
+
"codingModel": "glm-4.6"
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### Usage
|
|
384
|
+
|
|
385
|
+
```bash
|
|
386
|
+
# Use faster chat model for questions
|
|
387
|
+
ax-cli --chat-mode -p "explain what this project does"
|
|
388
|
+
|
|
389
|
+
# Use coding model (default) for implementation
|
|
390
|
+
ax-cli -p "implement user authentication"
|
|
391
|
+
|
|
392
|
+
# In interactive mode, default is coding model
|
|
393
|
+
ax-cli
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### Environment Variables
|
|
397
|
+
|
|
398
|
+
```bash
|
|
399
|
+
# Enable dual-model mode
|
|
400
|
+
export AI_DUAL_MODEL_ENABLED=true
|
|
401
|
+
export AI_CHAT_MODEL=glm-4-air
|
|
402
|
+
export AI_CODING_MODEL=glm-4.6
|
|
403
|
+
|
|
404
|
+
ax-cli --chat-mode
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
**Benefits:**
|
|
408
|
+
- 💰 **Cost savings**: Use faster/cheaper models for simple queries
|
|
409
|
+
- ⚡ **Better performance**: Match model capability to task complexity
|
|
410
|
+
- 🎯 **Manual control**: You decide when to use each model
|
|
411
|
+
|
|
331
412
|
## 🔌 MCP (Model Context Protocol)
|
|
332
413
|
|
|
333
414
|
Extend AX CLI with MCP servers for additional capabilities:
|
|
@@ -488,7 +569,7 @@ MIT License - see [LICENSE](LICENSE) for details
|
|
|
488
569
|
|
|
489
570
|
## 🙏 Acknowledgments
|
|
490
571
|
|
|
491
|
-
|
|
572
|
+
Built with **AutomatosX** multi-agent orchestration to achieve enterprise-class standards.
|
|
492
573
|
|
|
493
574
|
---
|
|
494
575
|
|
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor command - Diagnose AX CLI configuration and environment
|
|
3
|
+
* Checks API configuration, file system, MCP servers, models, and dependencies
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from "commander";
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
import { existsSync } from "fs";
|
|
8
|
+
import { homedir } from "os";
|
|
9
|
+
import { join } from "path";
|
|
10
|
+
import { exec } from "child_process";
|
|
11
|
+
import { promisify } from "util";
|
|
12
|
+
import OpenAI from "openai";
|
|
13
|
+
import { getSettingsManager } from "../utils/settings-manager.js";
|
|
14
|
+
import { GLM_MODELS } from "../constants.js";
|
|
15
|
+
import { parseJsonFile } from "../utils/json-utils.js";
|
|
16
|
+
const execAsync = promisify(exec);
|
|
17
|
+
export function createDoctorCommand() {
|
|
18
|
+
const doctorCmd = new Command("doctor")
|
|
19
|
+
.description("Diagnose AX CLI configuration and environment")
|
|
20
|
+
.option("--json", "Output results in JSON format")
|
|
21
|
+
.option("--verbose", "Show detailed diagnostic information")
|
|
22
|
+
.action(async (options) => {
|
|
23
|
+
try {
|
|
24
|
+
console.log(chalk.bold.cyan("\n🏥 AX CLI Doctor - Running diagnostics...\n"));
|
|
25
|
+
const results = [];
|
|
26
|
+
// 1. Check Node.js version
|
|
27
|
+
results.push(await checkNodeVersion());
|
|
28
|
+
// 2. Check config files
|
|
29
|
+
results.push(...checkConfigFiles());
|
|
30
|
+
// 3. Check API configuration
|
|
31
|
+
results.push(...await checkApiConfiguration());
|
|
32
|
+
// 4. Check model configuration
|
|
33
|
+
results.push(checkModelConfiguration());
|
|
34
|
+
// 5. Check MCP servers
|
|
35
|
+
results.push(...await checkMCPServers());
|
|
36
|
+
// 6. Check dependencies
|
|
37
|
+
results.push(...await checkDependencies());
|
|
38
|
+
// Output results
|
|
39
|
+
if (options.json) {
|
|
40
|
+
console.log(JSON.stringify(results, null, 2));
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
displayResults(results, options.verbose);
|
|
44
|
+
}
|
|
45
|
+
// Exit code based on results
|
|
46
|
+
const hasFailures = results.some(r => r.status === "fail");
|
|
47
|
+
process.exit(hasFailures ? 1 : 0);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error(chalk.red("\n❌ Doctor command failed:"), error instanceof Error ? error.message : String(error));
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
return doctorCmd;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check Node.js version
|
|
58
|
+
*/
|
|
59
|
+
async function checkNodeVersion() {
|
|
60
|
+
const currentVersion = process.version;
|
|
61
|
+
const majorVersion = parseInt(currentVersion.slice(1).split('.')[0], 10);
|
|
62
|
+
const requiredVersion = 24;
|
|
63
|
+
if (majorVersion >= requiredVersion) {
|
|
64
|
+
return {
|
|
65
|
+
name: "Node.js Version",
|
|
66
|
+
status: "pass",
|
|
67
|
+
message: `${currentVersion}`,
|
|
68
|
+
details: [`Required: Node.js ${requiredVersion}+`],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
name: "Node.js Version",
|
|
73
|
+
status: "fail",
|
|
74
|
+
message: `${currentVersion} (requires ${requiredVersion}+)`,
|
|
75
|
+
suggestion: `Upgrade Node.js to version ${requiredVersion} or higher`,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check configuration files
|
|
80
|
+
*/
|
|
81
|
+
function checkConfigFiles() {
|
|
82
|
+
const results = [];
|
|
83
|
+
// User config
|
|
84
|
+
const userConfigPath = join(homedir(), ".ax-cli", "config.json");
|
|
85
|
+
if (existsSync(userConfigPath)) {
|
|
86
|
+
const parseResult = parseJsonFile(userConfigPath);
|
|
87
|
+
if (parseResult.success) {
|
|
88
|
+
results.push({
|
|
89
|
+
name: "User Config File",
|
|
90
|
+
status: "pass",
|
|
91
|
+
message: "Found and valid",
|
|
92
|
+
details: [`Location: ${userConfigPath}`],
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
results.push({
|
|
97
|
+
name: "User Config File",
|
|
98
|
+
status: "fail",
|
|
99
|
+
message: "Found but corrupted",
|
|
100
|
+
details: [`Location: ${userConfigPath}`, `Error: ${parseResult.error}`],
|
|
101
|
+
suggestion: "Run 'ax-cli setup' to recreate configuration",
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
results.push({
|
|
107
|
+
name: "User Config File",
|
|
108
|
+
status: "warning",
|
|
109
|
+
message: "Not found",
|
|
110
|
+
details: [`Expected location: ${userConfigPath}`],
|
|
111
|
+
suggestion: "Run 'ax-cli setup' to create configuration",
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
// Project settings
|
|
115
|
+
const projectSettingsPath = join(process.cwd(), ".ax-cli", "settings.json");
|
|
116
|
+
if (existsSync(projectSettingsPath)) {
|
|
117
|
+
const parseResult = parseJsonFile(projectSettingsPath);
|
|
118
|
+
if (parseResult.success) {
|
|
119
|
+
results.push({
|
|
120
|
+
name: "Project Settings",
|
|
121
|
+
status: "pass",
|
|
122
|
+
message: "Found and valid",
|
|
123
|
+
details: [`Location: ${projectSettingsPath}`],
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
results.push({
|
|
128
|
+
name: "Project Settings",
|
|
129
|
+
status: "warning",
|
|
130
|
+
message: "Found but corrupted",
|
|
131
|
+
details: [`Location: ${projectSettingsPath}`, `Error: ${parseResult.error}`],
|
|
132
|
+
suggestion: "Run 'ax-cli init' to recreate project settings",
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
results.push({
|
|
138
|
+
name: "Project Settings",
|
|
139
|
+
status: "pass",
|
|
140
|
+
message: "Not configured (using user settings)",
|
|
141
|
+
details: [`Optional: ${projectSettingsPath}`],
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
return results;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Check API configuration
|
|
148
|
+
*/
|
|
149
|
+
async function checkApiConfiguration() {
|
|
150
|
+
const results = [];
|
|
151
|
+
const manager = getSettingsManager();
|
|
152
|
+
// API Key
|
|
153
|
+
const apiKey = manager.getApiKey();
|
|
154
|
+
if (apiKey && apiKey.trim()) {
|
|
155
|
+
results.push({
|
|
156
|
+
name: "API Key",
|
|
157
|
+
status: "pass",
|
|
158
|
+
message: "Configured",
|
|
159
|
+
details: [`Length: ${apiKey.length} characters`],
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
results.push({
|
|
164
|
+
name: "API Key",
|
|
165
|
+
status: "fail",
|
|
166
|
+
message: "Not configured",
|
|
167
|
+
suggestion: "Run 'ax-cli setup' to configure API key",
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
// Base URL
|
|
171
|
+
const baseURL = manager.getBaseURL();
|
|
172
|
+
if (baseURL && baseURL.trim()) {
|
|
173
|
+
// Test reachability
|
|
174
|
+
const reachable = await testEndpointReachability(baseURL);
|
|
175
|
+
if (reachable.success) {
|
|
176
|
+
results.push({
|
|
177
|
+
name: "Base URL",
|
|
178
|
+
status: "pass",
|
|
179
|
+
message: "Configured and reachable",
|
|
180
|
+
details: [`URL: ${baseURL}`],
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
results.push({
|
|
185
|
+
name: "Base URL",
|
|
186
|
+
status: "warning",
|
|
187
|
+
message: "Configured but unreachable",
|
|
188
|
+
details: [`URL: ${baseURL}`, `Error: ${reachable.error}`],
|
|
189
|
+
suggestion: "Check internet connection or firewall settings",
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
results.push({
|
|
195
|
+
name: "Base URL",
|
|
196
|
+
status: "fail",
|
|
197
|
+
message: "Not configured",
|
|
198
|
+
suggestion: "Run 'ax-cli setup' to configure base URL",
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
// Test API with minimal request
|
|
202
|
+
if (apiKey && baseURL) {
|
|
203
|
+
const model = manager.getCurrentModel();
|
|
204
|
+
if (model) {
|
|
205
|
+
const apiTest = await testApiConnection(baseURL, apiKey, model);
|
|
206
|
+
if (apiTest.success) {
|
|
207
|
+
results.push({
|
|
208
|
+
name: "API Connection",
|
|
209
|
+
status: "pass",
|
|
210
|
+
message: "Successfully connected",
|
|
211
|
+
details: [`Model: ${model}`],
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
results.push({
|
|
216
|
+
name: "API Connection",
|
|
217
|
+
status: "fail",
|
|
218
|
+
message: "Connection failed",
|
|
219
|
+
details: [`Error: ${apiTest.error}`],
|
|
220
|
+
suggestion: "Verify API key and base URL are correct",
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return results;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Check model configuration
|
|
229
|
+
*/
|
|
230
|
+
function checkModelConfiguration() {
|
|
231
|
+
const manager = getSettingsManager();
|
|
232
|
+
const model = manager.getCurrentModel();
|
|
233
|
+
if (!model) {
|
|
234
|
+
return {
|
|
235
|
+
name: "Model Configuration",
|
|
236
|
+
status: "fail",
|
|
237
|
+
message: "No model configured",
|
|
238
|
+
suggestion: "Run 'ax-cli setup' to configure default model",
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
// Check if model is in predefined list
|
|
242
|
+
const modelConfig = GLM_MODELS[model];
|
|
243
|
+
if (modelConfig) {
|
|
244
|
+
return {
|
|
245
|
+
name: "Model Configuration",
|
|
246
|
+
status: "pass",
|
|
247
|
+
message: `${model} (supported)`,
|
|
248
|
+
details: [
|
|
249
|
+
`Context: ${formatTokens(modelConfig.contextWindow)}`,
|
|
250
|
+
`Max Output: ${formatTokens(modelConfig.maxOutputTokens)}`,
|
|
251
|
+
`Thinking: ${modelConfig.supportsThinking ? "Yes" : "No"}`,
|
|
252
|
+
],
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
// Custom model (Ollama, etc)
|
|
256
|
+
return {
|
|
257
|
+
name: "Model Configuration",
|
|
258
|
+
status: "pass",
|
|
259
|
+
message: `${model} (custom)`,
|
|
260
|
+
details: ["This is a custom model not in predefined list"],
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Check MCP servers
|
|
265
|
+
*/
|
|
266
|
+
async function checkMCPServers() {
|
|
267
|
+
const results = [];
|
|
268
|
+
const manager = getSettingsManager();
|
|
269
|
+
try {
|
|
270
|
+
const projectSettings = manager.loadProjectSettings();
|
|
271
|
+
const mcpServers = projectSettings.mcpServers || {};
|
|
272
|
+
const serverNames = Object.keys(mcpServers);
|
|
273
|
+
if (serverNames.length === 0) {
|
|
274
|
+
results.push({
|
|
275
|
+
name: "MCP Servers",
|
|
276
|
+
status: "pass",
|
|
277
|
+
message: "No MCP servers configured",
|
|
278
|
+
details: ["Optional feature - run 'ax-cli mcp add' to add servers"],
|
|
279
|
+
});
|
|
280
|
+
return results;
|
|
281
|
+
}
|
|
282
|
+
results.push({
|
|
283
|
+
name: "MCP Servers",
|
|
284
|
+
status: "pass",
|
|
285
|
+
message: `${serverNames.length} server(s) configured`,
|
|
286
|
+
details: serverNames.map(name => `• ${name}`),
|
|
287
|
+
});
|
|
288
|
+
// Check each server configuration
|
|
289
|
+
for (const serverName of serverNames) {
|
|
290
|
+
const serverConfig = mcpServers[serverName];
|
|
291
|
+
const hasValidTransport = serverConfig.transport || (serverConfig.command && serverConfig.args);
|
|
292
|
+
if (hasValidTransport) {
|
|
293
|
+
results.push({
|
|
294
|
+
name: `MCP Server: ${serverName}`,
|
|
295
|
+
status: "pass",
|
|
296
|
+
message: "Configuration valid",
|
|
297
|
+
details: serverConfig.transport
|
|
298
|
+
? [`Transport: ${serverConfig.transport.type}`]
|
|
299
|
+
: [`Command: ${serverConfig.command}`],
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
results.push({
|
|
304
|
+
name: `MCP Server: ${serverName}`,
|
|
305
|
+
status: "warning",
|
|
306
|
+
message: "Configuration incomplete",
|
|
307
|
+
suggestion: "Check server configuration in .ax-cli/settings.json",
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
results.push({
|
|
314
|
+
name: "MCP Servers",
|
|
315
|
+
status: "warning",
|
|
316
|
+
message: "Could not check MCP configuration",
|
|
317
|
+
details: [error instanceof Error ? error.message : String(error)],
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
return results;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Check dependencies
|
|
324
|
+
*/
|
|
325
|
+
async function checkDependencies() {
|
|
326
|
+
const results = [];
|
|
327
|
+
// Check ripgrep (for search tool)
|
|
328
|
+
const rgCheck = await checkCommand("rg --version");
|
|
329
|
+
if (rgCheck.found) {
|
|
330
|
+
results.push({
|
|
331
|
+
name: "ripgrep (search)",
|
|
332
|
+
status: "pass",
|
|
333
|
+
message: "Installed",
|
|
334
|
+
details: rgCheck.version ? [`Version: ${rgCheck.version}`] : undefined,
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
results.push({
|
|
339
|
+
name: "ripgrep (search)",
|
|
340
|
+
status: "warning",
|
|
341
|
+
message: "Not found",
|
|
342
|
+
suggestion: "Install ripgrep for faster file search: brew install ripgrep",
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
// Check git
|
|
346
|
+
const gitCheck = await checkCommand("git --version");
|
|
347
|
+
if (gitCheck.found) {
|
|
348
|
+
results.push({
|
|
349
|
+
name: "git",
|
|
350
|
+
status: "pass",
|
|
351
|
+
message: "Installed",
|
|
352
|
+
details: gitCheck.version ? [`Version: ${gitCheck.version}`] : undefined,
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
results.push({
|
|
357
|
+
name: "git",
|
|
358
|
+
status: "warning",
|
|
359
|
+
message: "Not found",
|
|
360
|
+
details: ["Required for git operations"],
|
|
361
|
+
suggestion: "Install git: https://git-scm.com/downloads",
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
return results;
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Test endpoint reachability
|
|
368
|
+
*/
|
|
369
|
+
async function testEndpointReachability(baseURL) {
|
|
370
|
+
try {
|
|
371
|
+
// For local endpoints, check if service is running
|
|
372
|
+
if (baseURL.includes("localhost") || baseURL.includes("127.0.0.1")) {
|
|
373
|
+
const response = await fetch(baseURL.replace("/v1", "") + "/api/version", {
|
|
374
|
+
method: "GET",
|
|
375
|
+
signal: AbortSignal.timeout(3000),
|
|
376
|
+
});
|
|
377
|
+
if (response.ok) {
|
|
378
|
+
return { success: true };
|
|
379
|
+
}
|
|
380
|
+
return {
|
|
381
|
+
success: false,
|
|
382
|
+
error: "Local service not responding",
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
// For remote endpoints, try a simple request
|
|
386
|
+
const response = await fetch(baseURL + "/models", {
|
|
387
|
+
method: "GET",
|
|
388
|
+
signal: AbortSignal.timeout(5000),
|
|
389
|
+
});
|
|
390
|
+
// Any response means endpoint is reachable
|
|
391
|
+
if (response.status === 401 || response.status === 403 || response.ok) {
|
|
392
|
+
return { success: true };
|
|
393
|
+
}
|
|
394
|
+
return {
|
|
395
|
+
success: false,
|
|
396
|
+
error: `Server returned ${response.status}`,
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
catch (error) {
|
|
400
|
+
if (error?.name === "AbortError" || error?.name === "TimeoutError") {
|
|
401
|
+
return { success: false, error: "Connection timeout" };
|
|
402
|
+
}
|
|
403
|
+
if (error?.code === "ECONNREFUSED") {
|
|
404
|
+
return { success: false, error: "Connection refused" };
|
|
405
|
+
}
|
|
406
|
+
return {
|
|
407
|
+
success: false,
|
|
408
|
+
error: error instanceof Error ? error.message : "Network error",
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Test API connection with minimal request
|
|
414
|
+
*/
|
|
415
|
+
async function testApiConnection(baseURL, apiKey, model) {
|
|
416
|
+
try {
|
|
417
|
+
const client = new OpenAI({
|
|
418
|
+
baseURL,
|
|
419
|
+
apiKey,
|
|
420
|
+
timeout: 10000, // 10 second timeout
|
|
421
|
+
});
|
|
422
|
+
await client.chat.completions.create({
|
|
423
|
+
model,
|
|
424
|
+
messages: [{ role: "user", content: "test" }],
|
|
425
|
+
max_tokens: 1,
|
|
426
|
+
});
|
|
427
|
+
return { success: true };
|
|
428
|
+
}
|
|
429
|
+
catch (error) {
|
|
430
|
+
let errorMessage = error instanceof Error ? error.message : "Connection failed";
|
|
431
|
+
if (error?.status === 401) {
|
|
432
|
+
errorMessage = "Invalid or expired API key";
|
|
433
|
+
}
|
|
434
|
+
else if (error?.status === 403) {
|
|
435
|
+
errorMessage = "API key lacks required permissions";
|
|
436
|
+
}
|
|
437
|
+
else if (error?.status === 404) {
|
|
438
|
+
errorMessage = "Model not found";
|
|
439
|
+
}
|
|
440
|
+
else if (error?.error?.message) {
|
|
441
|
+
errorMessage = error.error.message;
|
|
442
|
+
}
|
|
443
|
+
return {
|
|
444
|
+
success: false,
|
|
445
|
+
error: errorMessage,
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Check if a command exists
|
|
451
|
+
*/
|
|
452
|
+
async function checkCommand(command) {
|
|
453
|
+
try {
|
|
454
|
+
const { stdout } = await execAsync(command, { timeout: 3000 });
|
|
455
|
+
const version = stdout.trim().split("\n")[0];
|
|
456
|
+
return { found: true, version };
|
|
457
|
+
}
|
|
458
|
+
catch {
|
|
459
|
+
return { found: false };
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Display results in formatted output
|
|
464
|
+
*/
|
|
465
|
+
function displayResults(results, verbose) {
|
|
466
|
+
let passCount = 0;
|
|
467
|
+
let warnCount = 0;
|
|
468
|
+
let failCount = 0;
|
|
469
|
+
console.log(chalk.bold("Diagnostic Results:\n"));
|
|
470
|
+
for (const result of results) {
|
|
471
|
+
let icon;
|
|
472
|
+
let color;
|
|
473
|
+
switch (result.status) {
|
|
474
|
+
case "pass":
|
|
475
|
+
icon = "✓";
|
|
476
|
+
color = chalk.green;
|
|
477
|
+
passCount++;
|
|
478
|
+
break;
|
|
479
|
+
case "warning":
|
|
480
|
+
icon = "⚠";
|
|
481
|
+
color = chalk.yellow;
|
|
482
|
+
warnCount++;
|
|
483
|
+
break;
|
|
484
|
+
case "fail":
|
|
485
|
+
icon = "✗";
|
|
486
|
+
color = chalk.red;
|
|
487
|
+
failCount++;
|
|
488
|
+
break;
|
|
489
|
+
}
|
|
490
|
+
console.log(color(`${icon} ${result.name}: ${result.message}`));
|
|
491
|
+
if (verbose && result.details) {
|
|
492
|
+
result.details.forEach(detail => {
|
|
493
|
+
console.log(chalk.dim(` ${detail}`));
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
if (result.suggestion) {
|
|
497
|
+
console.log(chalk.cyan(` 💡 ${result.suggestion}`));
|
|
498
|
+
}
|
|
499
|
+
console.log();
|
|
500
|
+
}
|
|
501
|
+
// Summary
|
|
502
|
+
console.log(chalk.bold("\nSummary:"));
|
|
503
|
+
console.log(chalk.green(` ✓ ${passCount} passed`));
|
|
504
|
+
if (warnCount > 0) {
|
|
505
|
+
console.log(chalk.yellow(` ⚠ ${warnCount} warnings`));
|
|
506
|
+
}
|
|
507
|
+
if (failCount > 0) {
|
|
508
|
+
console.log(chalk.red(` ✗ ${failCount} failed`));
|
|
509
|
+
}
|
|
510
|
+
console.log();
|
|
511
|
+
if (failCount === 0 && warnCount === 0) {
|
|
512
|
+
console.log(chalk.green.bold("✅ All checks passed! AX CLI is configured correctly.\n"));
|
|
513
|
+
}
|
|
514
|
+
else if (failCount > 0) {
|
|
515
|
+
console.log(chalk.red.bold("❌ Some checks failed. Please address the issues above.\n"));
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
console.log(chalk.yellow.bold("⚠️ Some warnings detected. Review suggestions above.\n"));
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
function formatTokens(tokens) {
|
|
522
|
+
if (tokens >= 1000) {
|
|
523
|
+
return `${(tokens / 1000).toFixed(0)}K tokens`;
|
|
524
|
+
}
|
|
525
|
+
return `${tokens} tokens`;
|
|
526
|
+
}
|
|
527
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGvD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAUlC,MAAM,UAAU,mBAAmB;IACjC,MAAM,SAAS,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;SACpC,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,QAAQ,EAAE,+BAA+B,CAAC;SACjD,MAAM,CAAC,WAAW,EAAE,sCAAsC,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;YAE9E,MAAM,OAAO,GAAkB,EAAE,CAAC;YAElC,2BAA2B;YAC3B,OAAO,CAAC,IAAI,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAAC;YAEvC,wBAAwB;YACxB,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,EAAE,CAAC,CAAC;YAEpC,6BAA6B;YAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,qBAAqB,EAAE,CAAC,CAAC;YAE/C,+BAA+B;YAC/B,OAAO,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC,CAAC;YAExC,uBAAuB;YACvB,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,eAAe,EAAE,CAAC,CAAC;YAEzC,wBAAwB;YACxB,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,iBAAiB,EAAE,CAAC,CAAC;YAE3C,iBAAiB;YACjB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;YAED,6BAA6B;YAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB;IAC7B,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IACvC,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzE,MAAM,eAAe,GAAG,EAAE,CAAC;IAE3B,IAAI,YAAY,IAAI,eAAe,EAAE,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,iBAAiB;YACvB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,GAAG,cAAc,EAAE;YAC5B,OAAO,EAAE,CAAC,qBAAqB,eAAe,GAAG,CAAC;SACnD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,GAAG,cAAc,cAAc,eAAe,IAAI;QAC3D,UAAU,EAAE,8BAA8B,eAAe,YAAY;KACtE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB;IACvB,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,cAAc;IACd,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IACjE,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,aAAa,CAAe,cAAc,CAAC,CAAC;QAChE,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE,CAAC,aAAa,cAAc,EAAE,CAAC;aACzC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,qBAAqB;gBAC9B,OAAO,EAAE,CAAC,aAAa,cAAc,EAAE,EAAE,UAAU,WAAW,CAAC,KAAK,EAAE,CAAC;gBACvE,UAAU,EAAE,8CAA8C;aAC3D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,CAAC,sBAAsB,cAAc,EAAE,CAAC;YACjD,UAAU,EAAE,4CAA4C;SACzD,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB;IACnB,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAC5E,IAAI,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,aAAa,CAAkB,mBAAmB,CAAC,CAAC;QACxE,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE,CAAC,aAAa,mBAAmB,EAAE,CAAC;aAC9C,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,qBAAqB;gBAC9B,OAAO,EAAE,CAAC,aAAa,mBAAmB,EAAE,EAAE,UAAU,WAAW,CAAC,KAAK,EAAE,CAAC;gBAC5E,UAAU,EAAE,gDAAgD;aAC7D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,sCAAsC;YAC/C,OAAO,EAAE,CAAC,aAAa,mBAAmB,EAAE,CAAC;SAC9C,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,qBAAqB;IAClC,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IAErC,UAAU;IACV,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IACnC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,YAAY;YACrB,OAAO,EAAE,CAAC,WAAW,MAAM,CAAC,MAAM,aAAa,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,gBAAgB;YACzB,UAAU,EAAE,yCAAyC;SACtD,CAAC,CAAC;IACL,CAAC;IAED,WAAW;IACX,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IACrC,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9B,oBAAoB;QACpB,MAAM,SAAS,GAAG,MAAM,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,0BAA0B;gBACnC,OAAO,EAAE,CAAC,QAAQ,OAAO,EAAE,CAAC;aAC7B,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,4BAA4B;gBACrC,OAAO,EAAE,CAAC,QAAQ,OAAO,EAAE,EAAE,UAAU,SAAS,CAAC,KAAK,EAAE,CAAC;gBACzD,UAAU,EAAE,gDAAgD;aAC7D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,gBAAgB;YACzB,UAAU,EAAE,0CAA0C;SACvD,CAAC,CAAC;IACL,CAAC;IAED,gCAAgC;IAChC,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QACxC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAChE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,gBAAgB;oBACtB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,wBAAwB;oBACjC,OAAO,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC;iBAC7B,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,gBAAgB;oBACtB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,mBAAmB;oBAC5B,OAAO,EAAE,CAAC,UAAU,OAAO,CAAC,KAAK,EAAE,CAAC;oBACpC,UAAU,EAAE,yCAAyC;iBACtD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB;IAC9B,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAExC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,IAAI,EAAE,qBAAqB;YAC3B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,qBAAqB;YAC9B,UAAU,EAAE,+CAA+C;SAC5D,CAAC;IACJ,CAAC;IAED,uCAAuC;IACvC,MAAM,WAAW,GAAG,UAAU,CAAC,KAAgC,CAAC,CAAC;IACjE,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;YACL,IAAI,EAAE,qBAAqB;YAC3B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,GAAG,KAAK,cAAc;YAC/B,OAAO,EAAE;gBACP,YAAY,YAAY,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE;gBACrD,eAAe,YAAY,CAAC,WAAW,CAAC,eAAe,CAAC,EAAE;gBAC1D,aAAa,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;aAC3D;SACF,CAAC;IACJ,CAAC;IAED,6BAA6B;IAC7B,OAAO;QACL,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,GAAG,KAAK,WAAW;QAC5B,OAAO,EAAE,CAAC,+CAA+C,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe;IAC5B,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IAErC,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACtD,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,IAAI,EAAE,CAAC;QACpD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE5C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,2BAA2B;gBACpC,OAAO,EAAE,CAAC,wDAAwD,CAAC;aACpE,CAAC,CAAC;YACH,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,GAAG,WAAW,CAAC,MAAM,uBAAuB;YACrD,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;SAC9C,CAAC,CAAC;QAEH,kCAAkC;QAClC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,MAAM,YAAY,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YAC5C,MAAM,iBAAiB,GAAG,YAAY,CAAC,SAAS,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;YAEhG,IAAI,iBAAiB,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,eAAe,UAAU,EAAE;oBACjC,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,qBAAqB;oBAC9B,OAAO,EAAE,YAAY,CAAC,SAAS;wBAC7B,CAAC,CAAC,CAAC,cAAc,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;wBAC/C,CAAC,CAAC,CAAC,YAAY,YAAY,CAAC,OAAO,EAAE,CAAC;iBACzC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,eAAe,UAAU,EAAE;oBACjC,MAAM,EAAE,SAAS;oBACjB,OAAO,EAAE,0BAA0B;oBACnC,UAAU,EAAE,qDAAqD;iBAClE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IAEH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,mCAAmC;YAC5C,OAAO,EAAE,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SAClE,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB;IAC9B,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,kCAAkC;IAClC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC,CAAC;IACnD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;SACvE,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,WAAW;YACpB,UAAU,EAAE,8DAA8D;SAC3E,CAAC,CAAC;IACL,CAAC;IAED,YAAY;IACZ,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,CAAC;IACrD,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;SACzE,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,CAAC,6BAA6B,CAAC;YACxC,UAAU,EAAE,4CAA4C;SACzD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,wBAAwB,CAAC,OAAe;IACrD,IAAI,CAAC;QACH,mDAAmD;QACnD,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACnE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,cAAc,EAAE;gBACxE,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,8BAA8B;aACtC,CAAC;QACJ,CAAC;QAED,6CAA6C;QAC7C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,GAAG,SAAS,EAAE;YAChD,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QAEH,2CAA2C;QAC3C,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YACtE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,mBAAmB,QAAQ,CAAC,MAAM,EAAE;SAC5C,CAAC;IAEJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,EAAE,IAAI,KAAK,YAAY,IAAI,KAAK,EAAE,IAAI,KAAK,cAAc,EAAE,CAAC;YACnE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;QACzD,CAAC;QAED,IAAI,KAAK,EAAE,IAAI,KAAK,cAAc,EAAE,CAAC;YACnC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;QACzD,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAC9B,OAAe,EACf,MAAc,EACd,KAAa;IAEb,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,OAAO;YACP,MAAM;YACN,OAAO,EAAE,KAAK,EAAE,oBAAoB;SACrC,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACnC,KAAK;YACL,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAC7C,UAAU,EAAE,CAAC;SACd,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAE3B,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;QAEhF,IAAI,KAAK,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;YAC1B,YAAY,GAAG,4BAA4B,CAAC;QAC9C,CAAC;aAAM,IAAI,KAAK,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;YACjC,YAAY,GAAG,oCAAoC,CAAC;QACtD,CAAC;aAAM,IAAI,KAAK,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;YACjC,YAAY,GAAG,iBAAiB,CAAC;QACnC,CAAC;aAAM,IAAI,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YACjC,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;QACrC,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,YAAY;SACpB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CACzB,OAAe;IAEf,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,OAAsB,EAAE,OAAgB;IAC9D,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAEjD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,IAAY,CAAC;QACjB,IAAI,KAA+B,CAAC;QAEpC,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,KAAK,MAAM;gBACT,IAAI,GAAG,GAAG,CAAC;gBACX,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;gBACpB,SAAS,EAAE,CAAC;gBACZ,MAAM;YACR,KAAK,SAAS;gBACZ,IAAI,GAAG,GAAG,CAAC;gBACX,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;gBACrB,SAAS,EAAE,CAAC;gBACZ,MAAM;YACR,KAAK,MAAM;gBACT,IAAI,GAAG,GAAG,CAAC;gBACX,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC;gBAClB,SAAS,EAAE,CAAC;gBACZ,MAAM;QACV,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhE,IAAI,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;gBAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,MAAM,EAAE,CAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,UAAU;IACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,SAAS,SAAS,CAAC,CAAC,CAAC;IACpD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,SAAS,WAAW,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,SAAS,SAAS,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC,CAAC;IAC1F,CAAC;SAAM,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC,CAAC;IAC1F,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,OAAO,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;IACjD,CAAC;IACD,OAAO,GAAG,MAAM,SAAS,CAAC;AAC5B,CAAC"}
|