@defai.digital/ax-cli 3.8.6 → 3.8.8
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 +28 -393
- package/config-defaults/models.yaml +0 -24
- package/config-defaults/settings.yaml +16 -16
- package/dist/agent/dependency-resolver.js +22 -1
- package/dist/agent/dependency-resolver.js.map +1 -1
- package/dist/agent/llm-agent.d.ts +23 -2
- package/dist/agent/llm-agent.js +126 -122
- package/dist/agent/llm-agent.js.map +1 -1
- package/dist/agent/loop-detector.d.ts +70 -0
- package/dist/agent/loop-detector.js +339 -0
- package/dist/agent/loop-detector.js.map +1 -0
- package/dist/agent/progress-tracker.d.ts +94 -0
- package/dist/agent/progress-tracker.js +222 -0
- package/dist/agent/progress-tracker.js.map +1 -0
- package/dist/agent/status-reporter.js +2 -2
- package/dist/agent/status-reporter.js.map +1 -1
- package/dist/agent/subagent.js +7 -3
- package/dist/agent/subagent.js.map +1 -1
- package/dist/analyzers/architecture/project-structure-scanner.js +6 -2
- package/dist/analyzers/architecture/project-structure-scanner.js.map +1 -1
- package/dist/analyzers/git/churn-calculator.js +2 -1
- package/dist/analyzers/git/churn-calculator.js.map +1 -1
- package/dist/checkpoint/manager.js +18 -4
- package/dist/checkpoint/manager.js.map +1 -1
- package/dist/checkpoint/storage.d.ts +6 -0
- package/dist/checkpoint/storage.js +96 -49
- package/dist/checkpoint/storage.js.map +1 -1
- package/dist/commands/cache.js +8 -6
- package/dist/commands/cache.js.map +1 -1
- package/dist/commands/doctor.js +19 -27
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/mcp-migrate.js +6 -5
- package/dist/commands/mcp-migrate.js.map +1 -1
- package/dist/commands/mcp.js +14 -2
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/models.js +8 -12
- package/dist/commands/models.js.map +1 -1
- package/dist/commands/plan.js +1 -10
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/setup.js +4 -3
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/status.js +40 -14
- package/dist/commands/status.js.map +1 -1
- package/dist/constants.d.ts +12 -0
- package/dist/constants.js +16 -4
- package/dist/constants.js.map +1 -1
- package/dist/hooks/hook-runner.d.ts +138 -0
- package/dist/hooks/hook-runner.js +429 -0
- package/dist/hooks/hook-runner.js.map +1 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/index.js +7 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.js +3 -21
- package/dist/index.js.map +1 -1
- package/dist/llm/client.d.ts +9 -0
- package/dist/llm/client.js +306 -45
- package/dist/llm/client.js.map +1 -1
- package/dist/llm/tools.js +2 -39
- package/dist/llm/tools.js.map +1 -1
- package/dist/llm/types.d.ts +1 -47
- package/dist/llm/types.js +0 -18
- package/dist/llm/types.js.map +1 -1
- package/dist/mcp/automatosx-loader.js +2 -1
- package/dist/mcp/automatosx-loader.js.map +1 -1
- package/dist/mcp/client-v2.d.ts +3 -0
- package/dist/mcp/client-v2.js +85 -19
- package/dist/mcp/client-v2.js.map +1 -1
- package/dist/mcp/config-migrator.js +3 -2
- package/dist/mcp/config-migrator.js.map +1 -1
- package/dist/mcp/config-v2.d.ts +5 -0
- package/dist/mcp/config-v2.js +26 -0
- package/dist/mcp/config-v2.js.map +1 -1
- package/dist/mcp/error-formatter.js +4 -1
- package/dist/mcp/error-formatter.js.map +1 -1
- package/dist/mcp/health.js +1 -1
- package/dist/mcp/health.js.map +1 -1
- package/dist/mcp/reconnection.js +2 -1
- package/dist/mcp/reconnection.js.map +1 -1
- package/dist/mcp/registry.js +3 -2
- package/dist/mcp/registry.js.map +1 -1
- package/dist/mcp/resources.js +2 -1
- package/dist/mcp/resources.js.map +1 -1
- package/dist/mcp/validation.js +9 -0
- package/dist/mcp/validation.js.map +1 -1
- package/dist/memory/context-store.js +4 -6
- package/dist/memory/context-store.js.map +1 -1
- package/dist/memory/types.d.ts +2 -0
- package/dist/memory/types.js +4 -1
- package/dist/memory/types.js.map +1 -1
- package/dist/permissions/index.d.ts +6 -0
- package/dist/permissions/index.js +7 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/permissions/permission-manager.d.ts +145 -0
- package/dist/permissions/permission-manager.js +401 -0
- package/dist/permissions/permission-manager.js.map +1 -0
- package/dist/planner/plan-storage.js +3 -2
- package/dist/planner/plan-storage.js.map +1 -1
- package/dist/planner/task-planner.js +2 -1
- package/dist/planner/task-planner.js.map +1 -1
- package/dist/planner/types.d.ts +6 -6
- package/dist/schemas/settings-schemas.d.ts +0 -14
- package/dist/schemas/settings-schemas.js +0 -10
- package/dist/schemas/settings-schemas.js.map +1 -1
- package/dist/schemas/tool-schemas.d.ts +2 -2
- package/dist/schemas/yaml-schemas.d.ts +15 -0
- package/dist/schemas/yaml-schemas.js +3 -0
- package/dist/schemas/yaml-schemas.js.map +1 -1
- package/dist/tools/bash.js +35 -10
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/confirmation-tool.js +3 -2
- package/dist/tools/confirmation-tool.js.map +1 -1
- package/dist/tools/registry.d.ts +1 -1
- package/dist/tools/registry.js +2 -1
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/search.js +12 -13
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/text-editor.d.ts +46 -0
- package/dist/tools/text-editor.js +455 -11
- package/dist/tools/text-editor.js.map +1 -1
- package/dist/tools/todo-tool.js +5 -4
- package/dist/tools/todo-tool.js.map +1 -1
- package/dist/ui/components/chat-input.js +10 -1
- package/dist/ui/components/chat-input.js.map +1 -1
- package/dist/ui/components/chat-interface.js +1 -0
- package/dist/ui/components/chat-interface.js.map +1 -1
- package/dist/ui/components/tool-group-display.js +0 -6
- package/dist/ui/components/tool-group-display.js.map +1 -1
- package/dist/ui/hooks/use-input-handler.js +7 -6
- package/dist/ui/hooks/use-input-handler.js.map +1 -1
- package/dist/ui/hooks/use-input-history.js +21 -13
- package/dist/ui/hooks/use-input-history.js.map +1 -1
- package/dist/ui/utils/tool-grouper.d.ts +1 -2
- package/dist/ui/utils/tool-grouper.js +4 -15
- package/dist/ui/utils/tool-grouper.js.map +1 -1
- package/dist/utils/api-error.d.ts +61 -0
- package/dist/utils/api-error.js +176 -0
- package/dist/utils/api-error.js.map +1 -0
- package/dist/utils/audit-logger.js +2 -1
- package/dist/utils/audit-logger.js.map +1 -1
- package/dist/utils/auto-accept-logger.js +3 -3
- package/dist/utils/auto-accept-logger.js.map +1 -1
- package/dist/utils/config-loader.d.ts +3 -0
- package/dist/utils/config-loader.js +27 -2
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/encryption.js +2 -1
- package/dist/utils/encryption.js.map +1 -1
- package/dist/utils/file-cache.js +4 -2
- package/dist/utils/file-cache.js.map +1 -1
- package/dist/utils/history-migration.js +5 -4
- package/dist/utils/history-migration.js.map +1 -1
- package/dist/utils/onboarding-manager.js +2 -1
- package/dist/utils/onboarding-manager.js.map +1 -1
- package/dist/utils/path-helpers.d.ts +8 -0
- package/dist/utils/path-helpers.js +35 -0
- package/dist/utils/path-helpers.js.map +1 -0
- package/dist/utils/path-security.js +3 -2
- package/dist/utils/path-security.js.map +1 -1
- package/dist/utils/retry-helper.d.ts +61 -0
- package/dist/utils/retry-helper.js +206 -0
- package/dist/utils/retry-helper.js.map +1 -0
- package/dist/utils/settings-manager.d.ts +1 -21
- package/dist/utils/settings-manager.js +2 -82
- package/dist/utils/settings-manager.js.map +1 -1
- package/dist/utils/streaming-analyzer.d.ts +2 -13
- package/dist/utils/streaming-analyzer.js +3 -25
- package/dist/utils/streaming-analyzer.js.map +1 -1
- package/dist/utils/token-counter.d.ts +13 -1
- package/dist/utils/token-counter.js +31 -6
- package/dist/utils/token-counter.js.map +1 -1
- package/package.json +3 -2
- package/packages/schemas/README.md +1 -1
- package/packages/schemas/package.json +1 -1
- package/dist/tools/web-search/cache.d.ts +0 -62
- package/dist/tools/web-search/cache.js +0 -105
- package/dist/tools/web-search/cache.js.map +0 -1
- package/dist/tools/web-search/engines/crates.d.ts +0 -19
- package/dist/tools/web-search/engines/crates.js +0 -87
- package/dist/tools/web-search/engines/crates.js.map +0 -1
- package/dist/tools/web-search/engines/npm.d.ts +0 -18
- package/dist/tools/web-search/engines/npm.js +0 -86
- package/dist/tools/web-search/engines/npm.js.map +0 -1
- package/dist/tools/web-search/engines/pypi.d.ts +0 -18
- package/dist/tools/web-search/engines/pypi.js +0 -75
- package/dist/tools/web-search/engines/pypi.js.map +0 -1
- package/dist/tools/web-search/index.d.ts +0 -11
- package/dist/tools/web-search/index.js +0 -11
- package/dist/tools/web-search/index.js.map +0 -1
- package/dist/tools/web-search/router.d.ts +0 -34
- package/dist/tools/web-search/router.js +0 -245
- package/dist/tools/web-search/router.js.map +0 -1
- package/dist/tools/web-search/types.d.ts +0 -45
- package/dist/tools/web-search/types.js +0 -6
- package/dist/tools/web-search/types.js.map +0 -1
- package/dist/tools/web-search/web-search-tool.d.ts +0 -51
- package/dist/tools/web-search/web-search-tool.js +0 -246
- package/dist/tools/web-search/web-search-tool.js.map +0 -1
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* Impact: Better UX, perceived 2-5x faster
|
|
9
9
|
*/
|
|
10
10
|
import { EventEmitter } from 'events';
|
|
11
|
+
import { formatDuration } from '../ui/utils/tool-grouper.js';
|
|
11
12
|
/**
|
|
12
13
|
* Streaming Analyzer
|
|
13
14
|
*
|
|
@@ -189,31 +190,8 @@ export function createProgressBar(progress, width = 40) {
|
|
|
189
190
|
const empty = ' '.repeat(emptyWidth);
|
|
190
191
|
return `[${filled}${empty}] ${progress.percentage.toFixed(1)}%`;
|
|
191
192
|
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
*
|
|
195
|
-
* @param ms - Duration in milliseconds
|
|
196
|
-
* @returns Formatted duration string
|
|
197
|
-
*
|
|
198
|
-
* @example
|
|
199
|
-
* ```typescript
|
|
200
|
-
* formatDuration(1500); // "1.5s"
|
|
201
|
-
* formatDuration(65000); // "1m 5s"
|
|
202
|
-
* ```
|
|
203
|
-
*/
|
|
204
|
-
export function formatDuration(ms) {
|
|
205
|
-
if (ms < 1000) {
|
|
206
|
-
return `${ms.toFixed(0)}ms`;
|
|
207
|
-
}
|
|
208
|
-
else if (ms < 60000) {
|
|
209
|
-
return `${(ms / 1000).toFixed(1)}s`;
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
const minutes = Math.floor(ms / 60000);
|
|
213
|
-
const seconds = Math.round((ms % 60000) / 1000);
|
|
214
|
-
return `${minutes}m ${seconds}s`;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
193
|
+
// Re-export formatDuration for backwards compatibility
|
|
194
|
+
export { formatDuration };
|
|
217
195
|
/**
|
|
218
196
|
* Helper function to format summary
|
|
219
197
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streaming-analyzer.js","sourceRoot":"","sources":["../../src/utils/streaming-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"streaming-analyzer.js","sourceRoot":"","sources":["../../src/utils/streaming-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ export declare class TokenCounter {
|
|
|
4
4
|
private cache;
|
|
5
5
|
private fingerprintToHashCache;
|
|
6
6
|
private model;
|
|
7
|
+
private disposed;
|
|
7
8
|
constructor(model?: string);
|
|
8
9
|
/**
|
|
9
10
|
* Create quick fingerprint to avoid redundant hashing
|
|
@@ -41,11 +42,22 @@ export declare class TokenCounter {
|
|
|
41
42
|
maxSize: number;
|
|
42
43
|
ttl?: number;
|
|
43
44
|
};
|
|
45
|
+
/**
|
|
46
|
+
* Whether this instance has been disposed
|
|
47
|
+
*/
|
|
48
|
+
isDisposed(): boolean;
|
|
44
49
|
}
|
|
45
50
|
/**
|
|
46
51
|
* Format token count for display (e.g., 1.2k for 1200)
|
|
52
|
+
* @param count - The token count to format
|
|
53
|
+
* @param options - Formatting options
|
|
54
|
+
* @param options.suffix - Whether to add " tokens" suffix (default: false)
|
|
55
|
+
* @param options.uppercase - Whether to use uppercase K/M (default: false)
|
|
47
56
|
*/
|
|
48
|
-
export declare function formatTokenCount(count: number
|
|
57
|
+
export declare function formatTokenCount(count: number, options?: {
|
|
58
|
+
suffix?: boolean;
|
|
59
|
+
uppercase?: boolean;
|
|
60
|
+
}): string;
|
|
49
61
|
/**
|
|
50
62
|
* Get or create a singleton token counter for the specified model
|
|
51
63
|
* Reuses encoder instances to avoid expensive tiktoken initialization
|
|
@@ -7,6 +7,7 @@ export class TokenCounter {
|
|
|
7
7
|
cache;
|
|
8
8
|
fingerprintToHashCache = new Map();
|
|
9
9
|
model; // CACHE FIX: Track model for cache key prefix
|
|
10
|
+
disposed = false; // Prevent use-after-dispose when singleton is reused
|
|
10
11
|
constructor(model = TOKEN_CONFIG.DEFAULT_MODEL) {
|
|
11
12
|
this.model = model;
|
|
12
13
|
try {
|
|
@@ -74,6 +75,9 @@ export class TokenCounter {
|
|
|
74
75
|
* Count tokens in a string with LRU caching for performance
|
|
75
76
|
*/
|
|
76
77
|
countTokens(text) {
|
|
78
|
+
if (this.disposed) {
|
|
79
|
+
throw new Error('TokenCounter has been disposed');
|
|
80
|
+
}
|
|
77
81
|
// CRITICAL FIX: Early return for empty strings without caching
|
|
78
82
|
// Prevents cache pollution where all empty strings share same cache key
|
|
79
83
|
if (!text)
|
|
@@ -97,6 +101,9 @@ export class TokenCounter {
|
|
|
97
101
|
* Count tokens in messages array (for chat completions)
|
|
98
102
|
*/
|
|
99
103
|
countMessageTokens(messages) {
|
|
104
|
+
if (this.disposed) {
|
|
105
|
+
throw new Error('TokenCounter has been disposed');
|
|
106
|
+
}
|
|
100
107
|
let totalTokens = 0;
|
|
101
108
|
for (const message of messages) {
|
|
102
109
|
// Every message follows <|start|>{role/name}\n{content}<|end|>\n
|
|
@@ -139,9 +146,12 @@ export class TokenCounter {
|
|
|
139
146
|
* Clean up resources
|
|
140
147
|
*/
|
|
141
148
|
dispose() {
|
|
149
|
+
if (this.disposed)
|
|
150
|
+
return;
|
|
142
151
|
this.cache.clear();
|
|
143
152
|
this.fingerprintToHashCache.clear();
|
|
144
153
|
this.encoder.free();
|
|
154
|
+
this.disposed = true;
|
|
145
155
|
}
|
|
146
156
|
/**
|
|
147
157
|
* Get cache statistics
|
|
@@ -149,25 +159,40 @@ export class TokenCounter {
|
|
|
149
159
|
getCacheStats() {
|
|
150
160
|
return this.cache.stats();
|
|
151
161
|
}
|
|
162
|
+
/**
|
|
163
|
+
* Whether this instance has been disposed
|
|
164
|
+
*/
|
|
165
|
+
isDisposed() {
|
|
166
|
+
return this.disposed;
|
|
167
|
+
}
|
|
152
168
|
}
|
|
153
169
|
/**
|
|
154
170
|
* Format token count for display (e.g., 1.2k for 1200)
|
|
171
|
+
* @param count - The token count to format
|
|
172
|
+
* @param options - Formatting options
|
|
173
|
+
* @param options.suffix - Whether to add " tokens" suffix (default: false)
|
|
174
|
+
* @param options.uppercase - Whether to use uppercase K/M (default: false)
|
|
155
175
|
*/
|
|
156
|
-
export function formatTokenCount(count) {
|
|
176
|
+
export function formatTokenCount(count, options) {
|
|
157
177
|
// CRITICAL FIX: Handle edge cases (NaN, Infinity, negative numbers)
|
|
158
178
|
// Prevents potential issues with invalid token counts
|
|
159
179
|
if (!Number.isFinite(count) || count < 0) {
|
|
160
|
-
return '0';
|
|
180
|
+
return options?.suffix ? '0 tokens' : '0';
|
|
161
181
|
}
|
|
182
|
+
const suffix = options?.suffix ? ' tokens' : '';
|
|
183
|
+
const kChar = options?.uppercase ? 'K' : 'k';
|
|
184
|
+
const mChar = options?.uppercase ? 'M' : 'm';
|
|
162
185
|
if (count <= 999) {
|
|
163
|
-
return Math.floor(count)
|
|
186
|
+
return `${Math.floor(count)}${suffix}`;
|
|
164
187
|
}
|
|
165
188
|
if (count < 1_000_000) {
|
|
166
189
|
const k = count / 1000;
|
|
167
|
-
|
|
190
|
+
const formatted = k % 1 === 0 ? `${Math.floor(k)}${kChar}` : `${k.toFixed(1)}${kChar}`;
|
|
191
|
+
return `${formatted}${suffix}`;
|
|
168
192
|
}
|
|
169
193
|
const m = count / 1_000_000;
|
|
170
|
-
|
|
194
|
+
const formatted = m % 1 === 0 ? `${Math.floor(m)}${mChar}` : `${m.toFixed(1)}${mChar}`;
|
|
195
|
+
return `${formatted}${suffix}`;
|
|
171
196
|
}
|
|
172
197
|
// Singleton instances keyed by model
|
|
173
198
|
const tokenCounterInstances = new Map();
|
|
@@ -181,7 +206,7 @@ const tokenCounterInstances = new Map();
|
|
|
181
206
|
export function getTokenCounter(model) {
|
|
182
207
|
const key = model || TOKEN_CONFIG.DEFAULT_MODEL;
|
|
183
208
|
let instance = tokenCounterInstances.get(key);
|
|
184
|
-
if (!instance) {
|
|
209
|
+
if (!instance || instance.isDisposed()) {
|
|
185
210
|
instance = new TokenCounter(key);
|
|
186
211
|
tokenCounterInstances.set(key, instance);
|
|
187
212
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-counter.js","sourceRoot":"","sources":["../../src/utils/token-counter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAY,MAAM,UAAU,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,MAAM,OAAO,YAAY;IACf,OAAO,CAAW;IAClB,KAAK,CAA2B;IAChC,sBAAsB,GAAwB,IAAI,GAAG,EAAE,CAAC;IACxD,KAAK,CAAS,CAAC,8CAA8C;
|
|
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": "3.8.
|
|
3
|
+
"version": "3.8.8",
|
|
4
4
|
"sdkVersion": "1.2.0",
|
|
5
5
|
"description": "Enterprise-Class AI Command Line Interface - Primary support for GLM (General Language Model) with multi-provider AI orchestration powered by AutomatosX.",
|
|
6
6
|
"type": "module",
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
"build:schemas": "cd packages/schemas && npm run build",
|
|
43
43
|
"dev": "tsx src/index.ts",
|
|
44
44
|
"start": "node dist/index.js",
|
|
45
|
+
"pretest": "npm run build:schemas",
|
|
45
46
|
"lint": "eslint . --ext .js,.jsx,.ts,.tsx",
|
|
46
47
|
"typecheck": "tsc --noEmit",
|
|
47
48
|
"test": "vitest run",
|
|
@@ -72,7 +73,7 @@
|
|
|
72
73
|
"author": "DEFAI Digital <https://defai.digital>",
|
|
73
74
|
"license": "MIT",
|
|
74
75
|
"dependencies": {
|
|
75
|
-
"@ax-cli/schemas": "
|
|
76
|
+
"@ax-cli/schemas": "workspace:*",
|
|
76
77
|
"@clack/prompts": "^0.11.0",
|
|
77
78
|
"@modelcontextprotocol/sdk": "^1.22.0",
|
|
78
79
|
"axios": "^1.7.0",
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Search Cache
|
|
3
|
-
* In-memory cache for web search results
|
|
4
|
-
*/
|
|
5
|
-
import type { WebSearchResult } from "./types.js";
|
|
6
|
-
export interface CacheEntry {
|
|
7
|
-
query: string;
|
|
8
|
-
results: WebSearchResult[];
|
|
9
|
-
timestamp: number;
|
|
10
|
-
ttl: number;
|
|
11
|
-
}
|
|
12
|
-
export declare class SearchCache {
|
|
13
|
-
private cache;
|
|
14
|
-
private readonly DEFAULT_TTL;
|
|
15
|
-
private readonly MAX_KEYS;
|
|
16
|
-
constructor(ttl?: number, maxKeys?: number);
|
|
17
|
-
/**
|
|
18
|
-
* Generate cache key from query
|
|
19
|
-
*/
|
|
20
|
-
private getCacheKey;
|
|
21
|
-
/**
|
|
22
|
-
* Get cached results for a query
|
|
23
|
-
*/
|
|
24
|
-
get(query: string): WebSearchResult[] | null;
|
|
25
|
-
/**
|
|
26
|
-
* Cache search results for a query
|
|
27
|
-
*/
|
|
28
|
-
set(query: string, results: WebSearchResult[], ttl?: number): void;
|
|
29
|
-
/**
|
|
30
|
-
* Check if query has cached results
|
|
31
|
-
*/
|
|
32
|
-
has(query: string): boolean;
|
|
33
|
-
/**
|
|
34
|
-
* Clear specific query from cache
|
|
35
|
-
*/
|
|
36
|
-
delete(query: string): void;
|
|
37
|
-
/**
|
|
38
|
-
* Clear all cached results
|
|
39
|
-
*/
|
|
40
|
-
clear(): void;
|
|
41
|
-
/**
|
|
42
|
-
* Get cache statistics
|
|
43
|
-
*/
|
|
44
|
-
getStats(): {
|
|
45
|
-
keys: number;
|
|
46
|
-
hits: number;
|
|
47
|
-
misses: number;
|
|
48
|
-
hitRate: number;
|
|
49
|
-
};
|
|
50
|
-
/**
|
|
51
|
-
* Get all cached queries (for debugging)
|
|
52
|
-
*/
|
|
53
|
-
getCachedQueries(): string[];
|
|
54
|
-
/**
|
|
55
|
-
* Get cache entry with metadata
|
|
56
|
-
*/
|
|
57
|
-
getEntry(query: string): CacheEntry | null;
|
|
58
|
-
/**
|
|
59
|
-
* Get TTL for a cached query
|
|
60
|
-
*/
|
|
61
|
-
getTTL(query: string): number | undefined;
|
|
62
|
-
}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Search Cache
|
|
3
|
-
* In-memory cache for web search results
|
|
4
|
-
*/
|
|
5
|
-
import NodeCache from "node-cache";
|
|
6
|
-
export class SearchCache {
|
|
7
|
-
cache;
|
|
8
|
-
DEFAULT_TTL = 300; // 5 minutes in seconds
|
|
9
|
-
MAX_KEYS = 500; // Maximum cache entries
|
|
10
|
-
constructor(ttl, maxKeys) {
|
|
11
|
-
this.cache = new NodeCache({
|
|
12
|
-
stdTTL: ttl || this.DEFAULT_TTL,
|
|
13
|
-
checkperiod: 60, // Check for expired entries every 60 seconds
|
|
14
|
-
maxKeys: maxKeys || this.MAX_KEYS,
|
|
15
|
-
useClones: false, // Better performance, but watch for mutations
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Generate cache key from query
|
|
20
|
-
*/
|
|
21
|
-
getCacheKey(query) {
|
|
22
|
-
return `search:${query.toLowerCase().trim()}`;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Get cached results for a query
|
|
26
|
-
*/
|
|
27
|
-
get(query) {
|
|
28
|
-
const key = this.getCacheKey(query);
|
|
29
|
-
const entry = this.cache.get(key);
|
|
30
|
-
if (!entry) {
|
|
31
|
-
return null;
|
|
32
|
-
}
|
|
33
|
-
// Return the cached results
|
|
34
|
-
return entry.results;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Cache search results for a query
|
|
38
|
-
*/
|
|
39
|
-
set(query, results, ttl) {
|
|
40
|
-
const key = this.getCacheKey(query);
|
|
41
|
-
const effectiveTtl = ttl || this.DEFAULT_TTL;
|
|
42
|
-
const entry = {
|
|
43
|
-
query,
|
|
44
|
-
results,
|
|
45
|
-
timestamp: Date.now(),
|
|
46
|
-
ttl: effectiveTtl,
|
|
47
|
-
};
|
|
48
|
-
this.cache.set(key, entry, effectiveTtl);
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Check if query has cached results
|
|
52
|
-
*/
|
|
53
|
-
has(query) {
|
|
54
|
-
const key = this.getCacheKey(query);
|
|
55
|
-
return this.cache.has(key);
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Clear specific query from cache
|
|
59
|
-
*/
|
|
60
|
-
delete(query) {
|
|
61
|
-
const key = this.getCacheKey(query);
|
|
62
|
-
this.cache.del(key);
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Clear all cached results
|
|
66
|
-
*/
|
|
67
|
-
clear() {
|
|
68
|
-
this.cache.flushAll();
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Get cache statistics
|
|
72
|
-
*/
|
|
73
|
-
getStats() {
|
|
74
|
-
const stats = this.cache.getStats();
|
|
75
|
-
const total = stats.hits + stats.misses;
|
|
76
|
-
const hitRate = total > 0 ? stats.hits / total : 0;
|
|
77
|
-
return {
|
|
78
|
-
keys: stats.keys,
|
|
79
|
-
hits: stats.hits,
|
|
80
|
-
misses: stats.misses,
|
|
81
|
-
hitRate: Math.round(hitRate * 100) / 100,
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Get all cached queries (for debugging)
|
|
86
|
-
*/
|
|
87
|
-
getCachedQueries() {
|
|
88
|
-
return this.cache.keys().map((key) => key.replace("search:", ""));
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Get cache entry with metadata
|
|
92
|
-
*/
|
|
93
|
-
getEntry(query) {
|
|
94
|
-
const key = this.getCacheKey(query);
|
|
95
|
-
return this.cache.get(key) || null;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Get TTL for a cached query
|
|
99
|
-
*/
|
|
100
|
-
getTTL(query) {
|
|
101
|
-
const key = this.getCacheKey(query);
|
|
102
|
-
return this.cache.getTtl(key);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
//# sourceMappingURL=cache.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/tools/web-search/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* crates.io (Rust Crates) Search Engine
|
|
3
|
-
* Free, unlimited search for Rust crates
|
|
4
|
-
* No API key required
|
|
5
|
-
*/
|
|
6
|
-
import type { SearchEngine, WebSearchResult, SearchOptions } from "../types.js";
|
|
7
|
-
export declare class CratesSearch implements SearchEngine {
|
|
8
|
-
readonly name = "crates.io";
|
|
9
|
-
private baseUrl;
|
|
10
|
-
private timeout;
|
|
11
|
-
/**
|
|
12
|
-
* Always available - no API key required
|
|
13
|
-
*/
|
|
14
|
-
isAvailable(): boolean;
|
|
15
|
-
search(query: string, options?: SearchOptions): Promise<WebSearchResult[]>;
|
|
16
|
-
private formatResults;
|
|
17
|
-
private createSnippet;
|
|
18
|
-
private calculateScore;
|
|
19
|
-
}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* crates.io (Rust Crates) Search Engine
|
|
3
|
-
* Free, unlimited search for Rust crates
|
|
4
|
-
* No API key required
|
|
5
|
-
*/
|
|
6
|
-
import axios from "axios";
|
|
7
|
-
export class CratesSearch {
|
|
8
|
-
name = "crates.io";
|
|
9
|
-
baseUrl = "https://crates.io/api/v1/crates";
|
|
10
|
-
timeout = 10000; // 10 second timeout
|
|
11
|
-
/**
|
|
12
|
-
* Always available - no API key required
|
|
13
|
-
*/
|
|
14
|
-
isAvailable() {
|
|
15
|
-
return true;
|
|
16
|
-
}
|
|
17
|
-
async search(query, options) {
|
|
18
|
-
try {
|
|
19
|
-
const params = new URLSearchParams({
|
|
20
|
-
q: query,
|
|
21
|
-
per_page: Math.min(options?.maxResults || 5, 20).toString(),
|
|
22
|
-
});
|
|
23
|
-
const response = await axios.get(`${this.baseUrl}?${params.toString()}`, {
|
|
24
|
-
timeout: options?.timeout || this.timeout,
|
|
25
|
-
headers: {
|
|
26
|
-
"User-Agent": "ax-cli",
|
|
27
|
-
Accept: "application/json",
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
return this.formatResults(response.data);
|
|
31
|
-
}
|
|
32
|
-
catch (error) {
|
|
33
|
-
if (axios.isAxiosError(error)) {
|
|
34
|
-
if (error.code === "ECONNABORTED") {
|
|
35
|
-
throw new Error("crates.io search timeout");
|
|
36
|
-
}
|
|
37
|
-
throw new Error(`crates.io error: ${error.response?.data?.errors?.[0]?.detail || error.message}`);
|
|
38
|
-
}
|
|
39
|
-
throw error;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
formatResults(response) {
|
|
43
|
-
return response.crates.map((crate) => ({
|
|
44
|
-
title: crate.name,
|
|
45
|
-
url: `https://crates.io/crates/${crate.name}`,
|
|
46
|
-
snippet: this.createSnippet(crate),
|
|
47
|
-
source: this.name,
|
|
48
|
-
relevanceScore: this.calculateScore(crate),
|
|
49
|
-
metadata: {
|
|
50
|
-
version: crate.newest_version,
|
|
51
|
-
downloads: crate.downloads,
|
|
52
|
-
recentDownloads: crate.recent_downloads,
|
|
53
|
-
documentation: crate.documentation,
|
|
54
|
-
homepage: crate.homepage,
|
|
55
|
-
repository: crate.repository,
|
|
56
|
-
},
|
|
57
|
-
}));
|
|
58
|
-
}
|
|
59
|
-
createSnippet(crate) {
|
|
60
|
-
const parts = [];
|
|
61
|
-
if (crate.description) {
|
|
62
|
-
parts.push(crate.description);
|
|
63
|
-
}
|
|
64
|
-
parts.push(`v${crate.newest_version}`);
|
|
65
|
-
if (crate.downloads > 1000000) {
|
|
66
|
-
parts.push(`${(crate.downloads / 1000000).toFixed(1)}M downloads`);
|
|
67
|
-
}
|
|
68
|
-
else if (crate.downloads > 1000) {
|
|
69
|
-
parts.push(`${(crate.downloads / 1000).toFixed(1)}K downloads`);
|
|
70
|
-
}
|
|
71
|
-
const indicators = [];
|
|
72
|
-
if (crate.downloads > 1000000)
|
|
73
|
-
indicators.push("very popular");
|
|
74
|
-
else if (crate.downloads > 100000)
|
|
75
|
-
indicators.push("popular");
|
|
76
|
-
if (indicators.length > 0) {
|
|
77
|
-
parts.push(`(${indicators.join(", ")})`);
|
|
78
|
-
}
|
|
79
|
-
return parts.join(" • ");
|
|
80
|
-
}
|
|
81
|
-
calculateScore(crate) {
|
|
82
|
-
// Score based on downloads (logarithmic scale)
|
|
83
|
-
const downloadScore = Math.min(Math.log10(crate.downloads + 1) * 10, 100);
|
|
84
|
-
return downloadScore;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
//# sourceMappingURL=crates.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crates.js","sourceRoot":"","sources":["../../../../src/tools/web-search/engines/crates.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* npm Registry Search Engine
|
|
3
|
-
* Free, unlimited search for npm packages
|
|
4
|
-
* No API key required
|
|
5
|
-
*/
|
|
6
|
-
import type { SearchEngine, WebSearchResult, SearchOptions } from "../types.js";
|
|
7
|
-
export declare class NpmSearch implements SearchEngine {
|
|
8
|
-
readonly name = "npm";
|
|
9
|
-
private baseUrl;
|
|
10
|
-
private timeout;
|
|
11
|
-
/**
|
|
12
|
-
* Always available - no API key required
|
|
13
|
-
*/
|
|
14
|
-
isAvailable(): boolean;
|
|
15
|
-
search(query: string, options?: SearchOptions): Promise<WebSearchResult[]>;
|
|
16
|
-
private formatResults;
|
|
17
|
-
private createSnippet;
|
|
18
|
-
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* npm Registry Search Engine
|
|
3
|
-
* Free, unlimited search for npm packages
|
|
4
|
-
* No API key required
|
|
5
|
-
*/
|
|
6
|
-
import axios from "axios";
|
|
7
|
-
export class NpmSearch {
|
|
8
|
-
name = "npm";
|
|
9
|
-
baseUrl = "https://registry.npmjs.org/-/v1/search";
|
|
10
|
-
timeout = 10000; // 10 second timeout
|
|
11
|
-
/**
|
|
12
|
-
* Always available - no API key required
|
|
13
|
-
*/
|
|
14
|
-
isAvailable() {
|
|
15
|
-
return true;
|
|
16
|
-
}
|
|
17
|
-
async search(query, options) {
|
|
18
|
-
try {
|
|
19
|
-
const params = new URLSearchParams({
|
|
20
|
-
text: query,
|
|
21
|
-
size: Math.min(options?.maxResults || 5, 20).toString(),
|
|
22
|
-
});
|
|
23
|
-
const response = await axios.get(`${this.baseUrl}?${params.toString()}`, {
|
|
24
|
-
timeout: options?.timeout || this.timeout,
|
|
25
|
-
headers: {
|
|
26
|
-
Accept: "application/json",
|
|
27
|
-
},
|
|
28
|
-
});
|
|
29
|
-
return this.formatResults(response.data);
|
|
30
|
-
}
|
|
31
|
-
catch (error) {
|
|
32
|
-
if (axios.isAxiosError(error)) {
|
|
33
|
-
if (error.code === "ECONNABORTED") {
|
|
34
|
-
throw new Error("npm search timeout");
|
|
35
|
-
}
|
|
36
|
-
throw new Error(`npm registry error: ${error.response?.data?.error || error.message}`);
|
|
37
|
-
}
|
|
38
|
-
throw error;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
formatResults(response) {
|
|
42
|
-
return response.objects.map((pkg) => ({
|
|
43
|
-
title: pkg.package.name,
|
|
44
|
-
url: pkg.package.links.npm || `https://www.npmjs.com/package/${pkg.package.name}`,
|
|
45
|
-
snippet: this.createSnippet(pkg),
|
|
46
|
-
source: this.name,
|
|
47
|
-
relevanceScore: pkg.score.final * 100, // Convert 0-1 to 0-100
|
|
48
|
-
publishedDate: pkg.package.date,
|
|
49
|
-
metadata: {
|
|
50
|
-
version: pkg.package.version,
|
|
51
|
-
author: pkg.package.author?.name || pkg.package.publisher.username,
|
|
52
|
-
quality: pkg.score.detail.quality,
|
|
53
|
-
popularity: pkg.score.detail.popularity,
|
|
54
|
-
maintenance: pkg.score.detail.maintenance,
|
|
55
|
-
homepage: pkg.package.links.homepage,
|
|
56
|
-
repository: pkg.package.links.repository,
|
|
57
|
-
},
|
|
58
|
-
}));
|
|
59
|
-
}
|
|
60
|
-
createSnippet(pkg) {
|
|
61
|
-
const parts = [];
|
|
62
|
-
if (pkg.package.description) {
|
|
63
|
-
parts.push(pkg.package.description);
|
|
64
|
-
}
|
|
65
|
-
parts.push(`v${pkg.package.version}`);
|
|
66
|
-
if (pkg.package.author?.name) {
|
|
67
|
-
parts.push(`by ${pkg.package.author.name}`);
|
|
68
|
-
}
|
|
69
|
-
// Add quality indicators
|
|
70
|
-
const quality = pkg.score.detail.quality;
|
|
71
|
-
const popularity = pkg.score.detail.popularity;
|
|
72
|
-
const maintenance = pkg.score.detail.maintenance;
|
|
73
|
-
const indicators = [];
|
|
74
|
-
if (quality > 0.7)
|
|
75
|
-
indicators.push("high quality");
|
|
76
|
-
if (popularity > 0.7)
|
|
77
|
-
indicators.push("popular");
|
|
78
|
-
if (maintenance > 0.7)
|
|
79
|
-
indicators.push("well-maintained");
|
|
80
|
-
if (indicators.length > 0) {
|
|
81
|
-
parts.push(`(${indicators.join(", ")})`);
|
|
82
|
-
}
|
|
83
|
-
return parts.join(" • ");
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
//# sourceMappingURL=npm.js.map
|