@defai.digital/ax-cli 3.14.18 → 3.15.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.
Files changed (63) hide show
  1. package/README.md +24 -2
  2. package/dist/mcp/client-v2.d.ts +103 -2
  3. package/dist/mcp/client-v2.js +299 -7
  4. package/dist/mcp/client-v2.js.map +1 -1
  5. package/dist/mcp/content-length-transport.d.ts +2 -0
  6. package/dist/mcp/content-length-transport.js +4 -1
  7. package/dist/mcp/content-length-transport.js.map +1 -1
  8. package/dist/mcp/index.d.ts +2 -0
  9. package/dist/mcp/index.js +4 -0
  10. package/dist/mcp/index.js.map +1 -1
  11. package/dist/mcp/schema-validator.d.ts +77 -0
  12. package/dist/mcp/schema-validator.js +125 -0
  13. package/dist/mcp/schema-validator.js.map +1 -0
  14. package/dist/mcp/subscriptions.d.ts +164 -0
  15. package/dist/mcp/subscriptions.js +242 -0
  16. package/dist/mcp/subscriptions.js.map +1 -0
  17. package/dist/mcp/transports.d.ts +3 -0
  18. package/dist/mcp/transports.js +11 -2
  19. package/dist/mcp/transports.js.map +1 -1
  20. package/dist/mcp/zai-templates.js +4 -0
  21. package/dist/mcp/zai-templates.js.map +1 -1
  22. package/dist/schemas/settings-schemas.js +7 -0
  23. package/dist/schemas/settings-schemas.js.map +1 -1
  24. package/package.json +1 -1
  25. package/.ax-cli/CUSTOM.md +0 -97
  26. package/.ax-cli/auto-accept-audit.json +0 -1302
  27. package/.ax-cli/index.json +0 -43
  28. package/.ax-cli/memory.json +0 -62
  29. package/.ax-cli/settings.json +0 -39
  30. package/ax.config.json +0 -304
  31. package/dist/analyzers/ast/tree-sitter-parser.d.ts +0 -134
  32. package/dist/analyzers/ast/tree-sitter-parser.js +0 -730
  33. package/dist/analyzers/ast/tree-sitter-parser.js.map +0 -1
  34. package/dist/mcp/config-detector-v2.d.ts +0 -83
  35. package/dist/mcp/config-detector-v2.js +0 -328
  36. package/dist/mcp/config-detector-v2.js.map +0 -1
  37. package/dist/mcp/config-migrator-v2.d.ts +0 -89
  38. package/dist/mcp/config-migrator-v2.js +0 -288
  39. package/dist/mcp/config-migrator-v2.js.map +0 -1
  40. package/dist/mcp/config-v2.d.ts +0 -111
  41. package/dist/mcp/config-v2.js +0 -443
  42. package/dist/mcp/config-v2.js.map +0 -1
  43. package/dist/mcp/transports-v2.d.ts +0 -152
  44. package/dist/mcp/transports-v2.js +0 -481
  45. package/dist/mcp/transports-v2.js.map +0 -1
  46. package/dist/utils/error-sanitizer.d.ts +0 -119
  47. package/dist/utils/error-sanitizer.js +0 -253
  48. package/dist/utils/error-sanitizer.js.map +0 -1
  49. package/dist/utils/errors.d.ts +0 -74
  50. package/dist/utils/errors.js +0 -139
  51. package/dist/utils/errors.js.map +0 -1
  52. package/dist/utils/incremental-analyzer.d.ts +0 -134
  53. package/dist/utils/incremental-analyzer.js +0 -377
  54. package/dist/utils/incremental-analyzer.js.map +0 -1
  55. package/dist/utils/math.d.ts +0 -1
  56. package/dist/utils/math.js +0 -4
  57. package/dist/utils/math.js.map +0 -1
  58. package/dist/utils/settings.d.ts +0 -1
  59. package/dist/utils/settings.js +0 -4
  60. package/dist/utils/settings.js.map +0 -1
  61. package/dist/utils/streaming-analyzer.d.ts +0 -160
  62. package/dist/utils/streaming-analyzer.js +0 -214
  63. package/dist/utils/streaming-analyzer.js.map +0 -1
@@ -1,214 +0,0 @@
1
- /**
2
- * Streaming Analyzer
3
- *
4
- * Emits analysis results as they're found instead of waiting for all files.
5
- * Provides better user experience with immediate feedback.
6
- *
7
- * Quick Win #3: Streaming Results (Est. time: 30 minutes)
8
- * Impact: Better UX, perceived 2-5x faster
9
- */
10
- import { EventEmitter } from 'events';
11
- import { formatDuration } from '../ui/utils/tool-grouper.js';
12
- /**
13
- * Streaming Analyzer
14
- *
15
- * Analyzes files and emits results as they're completed.
16
- *
17
- * @example
18
- * ```typescript
19
- * const analyzer = new StreamingAnalyzer();
20
- *
21
- * analyzer.on('result', (result) => {
22
- * if (result.error) {
23
- * console.error(`Error in ${result.file}: ${result.error.message}`);
24
- * } else {
25
- * console.log(`✓ ${result.file} (${result.duration}ms)`);
26
- * }
27
- * });
28
- *
29
- * analyzer.on('progress', (progress) => {
30
- * console.log(`Progress: ${progress.percentage}%`);
31
- * });
32
- *
33
- * analyzer.on('complete', (summary) => {
34
- * console.log(`Done! ${summary.successCount} files analyzed`);
35
- * });
36
- *
37
- * await analyzer.analyze(files, analyzeFile);
38
- * ```
39
- */
40
- export class StreamingAnalyzer extends EventEmitter {
41
- results = [];
42
- startTime = 0;
43
- completed = 0;
44
- total = 0;
45
- /**
46
- * Analyze files and emit results as they complete
47
- *
48
- * @param files - Array of file paths to analyze
49
- * @param analyzer - Analysis function
50
- * @returns Promise that resolves when all files are analyzed
51
- */
52
- async analyze(files, analyzer) {
53
- this.results = [];
54
- this.startTime = Date.now();
55
- this.completed = 0;
56
- this.total = files.length;
57
- for (const file of files) {
58
- await this.analyzeFile(file, analyzer);
59
- }
60
- return this.createSummary();
61
- }
62
- /**
63
- * Analyze files in parallel and emit results as they complete
64
- *
65
- * @param files - Array of file paths to analyze
66
- * @param analyzer - Analysis function
67
- * @param concurrency - Maximum concurrent analyses (default: 4)
68
- * @returns Promise that resolves when all files are analyzed
69
- */
70
- async analyzeParallel(files, analyzer, concurrency = 4) {
71
- this.results = [];
72
- this.startTime = Date.now();
73
- this.completed = 0;
74
- this.total = files.length;
75
- // Process files in parallel batches
76
- const queue = [...files];
77
- const executing = new Set();
78
- while (queue.length > 0 || executing.size > 0) {
79
- // Start new analyses up to concurrency limit
80
- while (queue.length > 0 && executing.size < concurrency) {
81
- const file = queue.shift();
82
- const promise = this.analyzeFile(file, analyzer);
83
- // Wrap promise to auto-remove from set when completed
84
- const tracked = promise.finally(() => {
85
- executing.delete(tracked);
86
- });
87
- executing.add(tracked);
88
- }
89
- // Wait for at least one to complete
90
- if (executing.size > 0) {
91
- await Promise.race(executing);
92
- }
93
- }
94
- return this.createSummary();
95
- }
96
- /**
97
- * Get current progress
98
- */
99
- getProgress() {
100
- const percentage = this.total > 0 ? (this.completed / this.total) * 100 : 0;
101
- const elapsed = Date.now() - this.startTime;
102
- const avgTimePerFile = this.completed > 0 ? elapsed / this.completed : 0;
103
- const remaining = this.total - this.completed;
104
- const estimatedTimeRemaining = avgTimePerFile * remaining;
105
- return {
106
- completed: this.completed,
107
- total: this.total,
108
- percentage,
109
- estimatedTimeRemaining: estimatedTimeRemaining > 0 ? estimatedTimeRemaining : undefined,
110
- };
111
- }
112
- /**
113
- * Analyze a single file and emit events
114
- */
115
- async analyzeFile(file, analyzer) {
116
- this.emit('start', file);
117
- const startTime = Date.now();
118
- let result;
119
- try {
120
- const analysisResult = await analyzer(file);
121
- const duration = Date.now() - startTime;
122
- result = {
123
- file,
124
- result: analysisResult,
125
- duration,
126
- cached: false, // Analyzer should set this
127
- };
128
- this.results.push(result);
129
- this.emit('result', result);
130
- }
131
- catch (error) {
132
- const duration = Date.now() - startTime;
133
- result = {
134
- file,
135
- error: error,
136
- duration,
137
- cached: false,
138
- };
139
- this.results.push(result);
140
- this.emit('result', result);
141
- this.emit('error', file, error);
142
- }
143
- this.completed++;
144
- this.emit('progress', this.getProgress());
145
- }
146
- /**
147
- * Create analysis summary
148
- */
149
- createSummary() {
150
- const successCount = this.results.filter((r) => !r.error).length;
151
- const errorCount = this.results.filter((r) => r.error).length;
152
- const cachedCount = this.results.filter((r) => r.cached).length;
153
- const totalDuration = Date.now() - this.startTime;
154
- const avgDuration = this.results.length > 0
155
- ? this.results.reduce((sum, r) => sum + r.duration, 0) / this.results.length
156
- : 0;
157
- const cacheHitRate = this.results.length > 0
158
- ? cachedCount / this.results.length
159
- : 0;
160
- const summary = {
161
- results: this.results,
162
- successCount,
163
- errorCount,
164
- cachedCount,
165
- totalDuration,
166
- avgDuration,
167
- cacheHitRate,
168
- };
169
- this.emit('complete', summary);
170
- return summary;
171
- }
172
- }
173
- /**
174
- * Helper function to create a progress bar string
175
- *
176
- * @param progress - Progress info
177
- * @param width - Width of progress bar (default: 40)
178
- * @returns Progress bar string
179
- *
180
- * @example
181
- * ```typescript
182
- * const bar = createProgressBar({ completed: 50, total: 100, percentage: 50 });
183
- * console.log(bar); // [#################### ] 50%
184
- * ```
185
- */
186
- export function createProgressBar(progress, width = 40) {
187
- const filledWidth = Math.round((progress.percentage / 100) * width);
188
- const emptyWidth = width - filledWidth;
189
- const filled = '#'.repeat(filledWidth);
190
- const empty = ' '.repeat(emptyWidth);
191
- return `[${filled}${empty}] ${progress.percentage.toFixed(1)}%`;
192
- }
193
- // Re-export formatDuration for backwards compatibility
194
- export { formatDuration };
195
- /**
196
- * Helper function to format summary
197
- *
198
- * @param summary - Analysis summary
199
- * @returns Formatted summary string
200
- */
201
- export function formatSummary(summary) {
202
- const lines = [];
203
- lines.push('Analysis Summary');
204
- lines.push('─'.repeat(50));
205
- lines.push(`Total files: ${summary.results.length}`);
206
- lines.push(`Successful: ${summary.successCount}`);
207
- lines.push(`Errors: ${summary.errorCount}`);
208
- lines.push(`Cached: ${summary.cachedCount}`);
209
- lines.push(`Total duration: ${formatDuration(summary.totalDuration)}`);
210
- lines.push(`Avg per file: ${formatDuration(summary.avgDuration)}`);
211
- lines.push(`Cache hit rate: ${(summary.cacheHitRate * 100).toFixed(1)}%`);
212
- return lines.join('\n');
213
- }
214
- //# sourceMappingURL=streaming-analyzer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"streaming-analyzer.js","sourceRoot":"","sources":["../../src/utils/streaming-analyzer.ts"],"names":[],"mappings":"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"}