@defai.digital/ax-cli 2.5.2 → 2.6.4

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 (54) hide show
  1. package/config/settings.yaml +28 -0
  2. package/dist/agent/context-manager.js +8 -6
  3. package/dist/agent/context-manager.js.map +1 -1
  4. package/dist/agent/llm-agent.js +19 -10
  5. package/dist/agent/llm-agent.js.map +1 -1
  6. package/dist/commands/cache.d.ts +7 -0
  7. package/dist/commands/cache.js +270 -0
  8. package/dist/commands/cache.js.map +1 -0
  9. package/dist/commands/mcp.js +6 -5
  10. package/dist/commands/mcp.js.map +1 -1
  11. package/dist/commands/memory.js.map +1 -1
  12. package/dist/constants.d.ts +2 -0
  13. package/dist/constants.js +2 -0
  14. package/dist/constants.js.map +1 -1
  15. package/dist/index.js +3 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/llm/client.d.ts +1 -1
  18. package/dist/llm/types.d.ts +9 -0
  19. package/dist/llm/types.js.map +1 -1
  20. package/dist/mcp/transports.js +4 -2
  21. package/dist/mcp/transports.js.map +1 -1
  22. package/dist/schemas/api-schemas.js +1 -0
  23. package/dist/schemas/api-schemas.js.map +1 -1
  24. package/dist/schemas/yaml-schemas.d.ts +10 -0
  25. package/dist/schemas/yaml-schemas.js +2 -0
  26. package/dist/schemas/yaml-schemas.js.map +1 -1
  27. package/dist/tools/bash.js +16 -3
  28. package/dist/tools/bash.js.map +1 -1
  29. package/dist/tools/text-editor.js +8 -5
  30. package/dist/tools/text-editor.js.map +1 -1
  31. package/dist/types/index.d.ts +2 -2
  32. package/dist/ui/components/chat-interface.js +27 -15
  33. package/dist/ui/components/chat-interface.js.map +1 -1
  34. package/dist/utils/config-loader.d.ts +2 -0
  35. package/dist/utils/config-loader.js.map +1 -1
  36. package/dist/utils/file-cache.d.ts +144 -0
  37. package/dist/utils/file-cache.js +412 -0
  38. package/dist/utils/file-cache.js.map +1 -0
  39. package/dist/utils/incremental-analyzer.d.ts +134 -0
  40. package/dist/utils/incremental-analyzer.js +361 -0
  41. package/dist/utils/incremental-analyzer.js.map +1 -0
  42. package/dist/utils/message-optimizer.d.ts +99 -0
  43. package/dist/utils/message-optimizer.js +291 -0
  44. package/dist/utils/message-optimizer.js.map +1 -0
  45. package/dist/utils/parallel-analyzer.d.ts +123 -0
  46. package/dist/utils/parallel-analyzer.js +228 -0
  47. package/dist/utils/parallel-analyzer.js.map +1 -0
  48. package/dist/utils/streaming-analyzer.d.ts +171 -0
  49. package/dist/utils/streaming-analyzer.js +248 -0
  50. package/dist/utils/streaming-analyzer.js.map +1 -0
  51. package/dist/utils/token-counter.d.ts +2 -5
  52. package/dist/utils/token-counter.js +12 -3
  53. package/dist/utils/token-counter.js.map +1 -1
  54. package/package.json +1 -1
@@ -0,0 +1,171 @@
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
+ /**
12
+ * Analysis result for a single file
13
+ */
14
+ export interface FileAnalysisResult<T = unknown> {
15
+ /** File path */
16
+ file: string;
17
+ /** Analysis result */
18
+ result?: T;
19
+ /** Error if analysis failed */
20
+ error?: Error;
21
+ /** Analysis duration in ms */
22
+ duration: number;
23
+ /** Whether result was from cache */
24
+ cached: boolean;
25
+ }
26
+ /**
27
+ * Progress update
28
+ */
29
+ export interface AnalysisProgress {
30
+ /** Number of files completed */
31
+ completed: number;
32
+ /** Total number of files */
33
+ total: number;
34
+ /** Current file being analyzed */
35
+ currentFile?: string;
36
+ /** Percentage complete (0-100) */
37
+ percentage: number;
38
+ /** Estimated time remaining in ms */
39
+ estimatedTimeRemaining?: number;
40
+ }
41
+ /**
42
+ * Analysis summary
43
+ */
44
+ export interface AnalysisSummary<T = unknown> {
45
+ /** All results */
46
+ results: FileAnalysisResult<T>[];
47
+ /** Number of successful analyses */
48
+ successCount: number;
49
+ /** Number of failed analyses */
50
+ errorCount: number;
51
+ /** Number of cached results */
52
+ cachedCount: number;
53
+ /** Total duration in ms */
54
+ totalDuration: number;
55
+ /** Average duration per file in ms */
56
+ avgDuration: number;
57
+ /** Cache hit rate (0-1) */
58
+ cacheHitRate: number;
59
+ }
60
+ /**
61
+ * Streaming analyzer events
62
+ */
63
+ export interface StreamingAnalyzerEvents<T = unknown> {
64
+ /** Emitted when a file analysis starts */
65
+ start: (file: string) => void;
66
+ /** Emitted when a file analysis completes */
67
+ result: (result: FileAnalysisResult<T>) => void;
68
+ /** Emitted on progress updates */
69
+ progress: (progress: AnalysisProgress) => void;
70
+ /** Emitted when all files are analyzed */
71
+ complete: (summary: AnalysisSummary<T>) => void;
72
+ /** Emitted on error */
73
+ error: (file: string, error: Error) => void;
74
+ }
75
+ /**
76
+ * Streaming Analyzer
77
+ *
78
+ * Analyzes files and emits results as they're completed.
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * const analyzer = new StreamingAnalyzer();
83
+ *
84
+ * analyzer.on('result', (result) => {
85
+ * if (result.error) {
86
+ * console.error(`Error in ${result.file}: ${result.error.message}`);
87
+ * } else {
88
+ * console.log(`✓ ${result.file} (${result.duration}ms)`);
89
+ * }
90
+ * });
91
+ *
92
+ * analyzer.on('progress', (progress) => {
93
+ * console.log(`Progress: ${progress.percentage}%`);
94
+ * });
95
+ *
96
+ * analyzer.on('complete', (summary) => {
97
+ * console.log(`Done! ${summary.successCount} files analyzed`);
98
+ * });
99
+ *
100
+ * await analyzer.analyze(files, analyzeFile);
101
+ * ```
102
+ */
103
+ export declare class StreamingAnalyzer<T = unknown> extends EventEmitter {
104
+ private results;
105
+ private startTime;
106
+ private completed;
107
+ private total;
108
+ /**
109
+ * Analyze files and emit results as they complete
110
+ *
111
+ * @param files - Array of file paths to analyze
112
+ * @param analyzer - Analysis function
113
+ * @returns Promise that resolves when all files are analyzed
114
+ */
115
+ analyze(files: string[], analyzer: (file: string) => Promise<T>): Promise<AnalysisSummary<T>>;
116
+ /**
117
+ * Analyze files in parallel and emit results as they complete
118
+ *
119
+ * @param files - Array of file paths to analyze
120
+ * @param analyzer - Analysis function
121
+ * @param concurrency - Maximum concurrent analyses (default: 4)
122
+ * @returns Promise that resolves when all files are analyzed
123
+ */
124
+ analyzeParallel(files: string[], analyzer: (file: string) => Promise<T>, concurrency?: number): Promise<AnalysisSummary<T>>;
125
+ /**
126
+ * Get current progress
127
+ */
128
+ getProgress(): AnalysisProgress;
129
+ /**
130
+ * Analyze a single file and emit events
131
+ */
132
+ private analyzeFile;
133
+ /**
134
+ * Create analysis summary
135
+ */
136
+ private createSummary;
137
+ }
138
+ /**
139
+ * Helper function to create a progress bar string
140
+ *
141
+ * @param progress - Progress info
142
+ * @param width - Width of progress bar (default: 40)
143
+ * @returns Progress bar string
144
+ *
145
+ * @example
146
+ * ```typescript
147
+ * const bar = createProgressBar({ completed: 50, total: 100, percentage: 50 });
148
+ * console.log(bar); // [#################### ] 50%
149
+ * ```
150
+ */
151
+ export declare function createProgressBar(progress: AnalysisProgress, width?: number): string;
152
+ /**
153
+ * Helper function to format duration
154
+ *
155
+ * @param ms - Duration in milliseconds
156
+ * @returns Formatted duration string
157
+ *
158
+ * @example
159
+ * ```typescript
160
+ * formatDuration(1500); // "1.5s"
161
+ * formatDuration(65000); // "1m 5s"
162
+ * ```
163
+ */
164
+ export declare function formatDuration(ms: number): string;
165
+ /**
166
+ * Helper function to format summary
167
+ *
168
+ * @param summary - Analysis summary
169
+ * @returns Formatted summary string
170
+ */
171
+ export declare function formatSummary<T>(summary: AnalysisSummary<T>): string;
@@ -0,0 +1,248 @@
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
+ /**
12
+ * Streaming Analyzer
13
+ *
14
+ * Analyzes files and emits results as they're completed.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const analyzer = new StreamingAnalyzer();
19
+ *
20
+ * analyzer.on('result', (result) => {
21
+ * if (result.error) {
22
+ * console.error(`Error in ${result.file}: ${result.error.message}`);
23
+ * } else {
24
+ * console.log(`✓ ${result.file} (${result.duration}ms)`);
25
+ * }
26
+ * });
27
+ *
28
+ * analyzer.on('progress', (progress) => {
29
+ * console.log(`Progress: ${progress.percentage}%`);
30
+ * });
31
+ *
32
+ * analyzer.on('complete', (summary) => {
33
+ * console.log(`Done! ${summary.successCount} files analyzed`);
34
+ * });
35
+ *
36
+ * await analyzer.analyze(files, analyzeFile);
37
+ * ```
38
+ */
39
+ export class StreamingAnalyzer extends EventEmitter {
40
+ results = [];
41
+ startTime = 0;
42
+ completed = 0;
43
+ total = 0;
44
+ /**
45
+ * Analyze files and emit results as they complete
46
+ *
47
+ * @param files - Array of file paths to analyze
48
+ * @param analyzer - Analysis function
49
+ * @returns Promise that resolves when all files are analyzed
50
+ */
51
+ async analyze(files, analyzer) {
52
+ this.results = [];
53
+ this.startTime = Date.now();
54
+ this.completed = 0;
55
+ this.total = files.length;
56
+ for (const file of files) {
57
+ await this.analyzeFile(file, analyzer);
58
+ }
59
+ return this.createSummary();
60
+ }
61
+ /**
62
+ * Analyze files in parallel and emit results as they complete
63
+ *
64
+ * @param files - Array of file paths to analyze
65
+ * @param analyzer - Analysis function
66
+ * @param concurrency - Maximum concurrent analyses (default: 4)
67
+ * @returns Promise that resolves when all files are analyzed
68
+ */
69
+ async analyzeParallel(files, analyzer, concurrency = 4) {
70
+ this.results = [];
71
+ this.startTime = Date.now();
72
+ this.completed = 0;
73
+ this.total = files.length;
74
+ // Process files in parallel batches
75
+ const queue = [...files];
76
+ const executing = [];
77
+ while (queue.length > 0 || executing.length > 0) {
78
+ // Start new analyses up to concurrency limit
79
+ while (queue.length > 0 && executing.length < concurrency) {
80
+ const file = queue.shift();
81
+ const promise = this.analyzeFile(file, analyzer);
82
+ executing.push(promise);
83
+ }
84
+ // Wait for at least one to complete
85
+ if (executing.length > 0) {
86
+ await Promise.race(executing);
87
+ // Remove completed promises
88
+ for (let i = executing.length - 1; i >= 0; i--) {
89
+ const promise = executing[i];
90
+ // Check if promise is settled
91
+ let settled = false;
92
+ promise.then(() => {
93
+ settled = true;
94
+ }, () => {
95
+ settled = true;
96
+ });
97
+ // Allow microtask queue to process
98
+ await Promise.resolve();
99
+ if (settled) {
100
+ executing.splice(i, 1);
101
+ }
102
+ }
103
+ }
104
+ }
105
+ return this.createSummary();
106
+ }
107
+ /**
108
+ * Get current progress
109
+ */
110
+ getProgress() {
111
+ const percentage = this.total > 0 ? (this.completed / this.total) * 100 : 0;
112
+ const elapsed = Date.now() - this.startTime;
113
+ const avgTimePerFile = this.completed > 0 ? elapsed / this.completed : 0;
114
+ const remaining = this.total - this.completed;
115
+ const estimatedTimeRemaining = avgTimePerFile * remaining;
116
+ return {
117
+ completed: this.completed,
118
+ total: this.total,
119
+ percentage,
120
+ estimatedTimeRemaining: estimatedTimeRemaining > 0 ? estimatedTimeRemaining : undefined,
121
+ };
122
+ }
123
+ /**
124
+ * Analyze a single file and emit events
125
+ */
126
+ async analyzeFile(file, analyzer) {
127
+ this.emit('start', file);
128
+ const startTime = Date.now();
129
+ let result;
130
+ try {
131
+ const analysisResult = await analyzer(file);
132
+ const duration = Date.now() - startTime;
133
+ result = {
134
+ file,
135
+ result: analysisResult,
136
+ duration,
137
+ cached: false, // Analyzer should set this
138
+ };
139
+ this.results.push(result);
140
+ this.emit('result', result);
141
+ }
142
+ catch (error) {
143
+ const duration = Date.now() - startTime;
144
+ result = {
145
+ file,
146
+ error: error,
147
+ duration,
148
+ cached: false,
149
+ };
150
+ this.results.push(result);
151
+ this.emit('result', result);
152
+ this.emit('error', file, error);
153
+ }
154
+ this.completed++;
155
+ this.emit('progress', this.getProgress());
156
+ }
157
+ /**
158
+ * Create analysis summary
159
+ */
160
+ createSummary() {
161
+ const successCount = this.results.filter((r) => !r.error).length;
162
+ const errorCount = this.results.filter((r) => r.error).length;
163
+ const cachedCount = this.results.filter((r) => r.cached).length;
164
+ const totalDuration = Date.now() - this.startTime;
165
+ const avgDuration = this.results.length > 0
166
+ ? this.results.reduce((sum, r) => sum + r.duration, 0) / this.results.length
167
+ : 0;
168
+ const cacheHitRate = this.results.length > 0
169
+ ? cachedCount / this.results.length
170
+ : 0;
171
+ const summary = {
172
+ results: this.results,
173
+ successCount,
174
+ errorCount,
175
+ cachedCount,
176
+ totalDuration,
177
+ avgDuration,
178
+ cacheHitRate,
179
+ };
180
+ this.emit('complete', summary);
181
+ return summary;
182
+ }
183
+ }
184
+ /**
185
+ * Helper function to create a progress bar string
186
+ *
187
+ * @param progress - Progress info
188
+ * @param width - Width of progress bar (default: 40)
189
+ * @returns Progress bar string
190
+ *
191
+ * @example
192
+ * ```typescript
193
+ * const bar = createProgressBar({ completed: 50, total: 100, percentage: 50 });
194
+ * console.log(bar); // [#################### ] 50%
195
+ * ```
196
+ */
197
+ export function createProgressBar(progress, width = 40) {
198
+ const filledWidth = Math.round((progress.percentage / 100) * width);
199
+ const emptyWidth = width - filledWidth;
200
+ const filled = '#'.repeat(filledWidth);
201
+ const empty = ' '.repeat(emptyWidth);
202
+ return `[${filled}${empty}] ${progress.percentage.toFixed(1)}%`;
203
+ }
204
+ /**
205
+ * Helper function to format duration
206
+ *
207
+ * @param ms - Duration in milliseconds
208
+ * @returns Formatted duration string
209
+ *
210
+ * @example
211
+ * ```typescript
212
+ * formatDuration(1500); // "1.5s"
213
+ * formatDuration(65000); // "1m 5s"
214
+ * ```
215
+ */
216
+ export function formatDuration(ms) {
217
+ if (ms < 1000) {
218
+ return `${ms.toFixed(0)}ms`;
219
+ }
220
+ else if (ms < 60000) {
221
+ return `${(ms / 1000).toFixed(1)}s`;
222
+ }
223
+ else {
224
+ const minutes = Math.floor(ms / 60000);
225
+ const seconds = Math.round((ms % 60000) / 1000);
226
+ return `${minutes}m ${seconds}s`;
227
+ }
228
+ }
229
+ /**
230
+ * Helper function to format summary
231
+ *
232
+ * @param summary - Analysis summary
233
+ * @returns Formatted summary string
234
+ */
235
+ export function formatSummary(summary) {
236
+ const lines = [];
237
+ lines.push('Analysis Summary');
238
+ lines.push('─'.repeat(50));
239
+ lines.push(`Total files: ${summary.results.length}`);
240
+ lines.push(`Successful: ${summary.successCount}`);
241
+ lines.push(`Errors: ${summary.errorCount}`);
242
+ lines.push(`Cached: ${summary.cachedCount}`);
243
+ lines.push(`Total duration: ${formatDuration(summary.totalDuration)}`);
244
+ lines.push(`Avg per file: ${formatDuration(summary.avgDuration)}`);
245
+ lines.push(`Cache hit rate: ${(summary.cacheHitRate * 100).toFixed(1)}%`);
246
+ return lines.join('\n');
247
+ }
248
+ //# sourceMappingURL=streaming-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-analyzer.js","sourceRoot":"","sources":["../../src/utils/streaming-analyzer.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { ChatCompletionMessageParam } from 'openai/resources/chat.js';
1
2
  export declare class TokenCounter {
2
3
  private encoder;
3
4
  private cache;
@@ -9,11 +10,7 @@ export declare class TokenCounter {
9
10
  /**
10
11
  * Count tokens in messages array (for chat completions)
11
12
  */
12
- countMessageTokens(messages: Array<{
13
- role: string;
14
- content: string | null;
15
- [key: string]: any;
16
- }>): number;
13
+ countMessageTokens(messages: ChatCompletionMessageParam[]): number;
17
14
  /**
18
15
  * Estimate tokens for streaming content
19
16
  * This is an approximation since we don't have the full response yet
@@ -41,14 +41,23 @@ export class TokenCounter {
41
41
  for (const message of messages) {
42
42
  // Every message follows <|start|>{role/name}\n{content}<|end|>\n
43
43
  totalTokens += TOKEN_CONFIG.TOKENS_PER_MESSAGE;
44
- if (message.content && typeof message.content === 'string') {
45
- totalTokens += this.countTokens(message.content);
44
+ if (message.content) {
45
+ if (typeof message.content === 'string') {
46
+ totalTokens += this.countTokens(message.content);
47
+ }
48
+ else if (Array.isArray(message.content)) {
49
+ for (const part of message.content) {
50
+ if (part.type === 'text' && part.text) {
51
+ totalTokens += this.countTokens(part.text);
52
+ }
53
+ }
54
+ }
46
55
  }
47
56
  if (message.role) {
48
57
  totalTokens += this.countTokens(message.role);
49
58
  }
50
59
  // Add extra tokens for tool calls if present
51
- if (message.tool_calls && Array.isArray(message.tool_calls) && message.tool_calls.length > 0) {
60
+ if ((message.role === 'assistant' || message.role === 'tool') && 'tool_calls' in message && Array.isArray(message.tool_calls) && message.tool_calls.length > 0) {
52
61
  totalTokens += this.countTokens(JSON.stringify(message.tool_calls));
53
62
  }
54
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"token-counter.js","sourceRoot":"","sources":["../../src/utils/token-counter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"token-counter.js","sourceRoot":"","sources":["../../src/utils/token-counter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defai.digital/ax-cli",
3
- "version": "2.5.2",
3
+ "version": "2.6.4",
4
4
  "description": "Enterprise-Class AI Command Line Interface - Primary support for GLM (General Language Model) with multi-provider AI orchestration powered by AutomatosX.",
5
5
  "type": "module",
6
6
  "workspaces": [