@defai.digital/ax-cli 3.3.0 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/.ax-cli/memory.json +6 -6
  2. package/README.md +110 -0
  3. package/config/settings.yaml +6 -0
  4. package/dist/agent/dependency-resolver.js +2 -1
  5. package/dist/agent/dependency-resolver.js.map +1 -1
  6. package/dist/agent/llm-agent.d.ts +3 -0
  7. package/dist/agent/llm-agent.js +57 -8
  8. package/dist/agent/llm-agent.js.map +1 -1
  9. package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.d.ts +29 -0
  10. package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.js +103 -0
  11. package/dist/analyzers/architecture/anti-pattern-detectors/god-object-detector.js.map +1 -0
  12. package/dist/analyzers/architecture/architecture-analyzer.d.ts +58 -0
  13. package/dist/analyzers/architecture/architecture-analyzer.js +276 -0
  14. package/dist/analyzers/architecture/architecture-analyzer.js.map +1 -0
  15. package/dist/analyzers/architecture/index.d.ts +12 -0
  16. package/dist/analyzers/architecture/index.js +14 -0
  17. package/dist/analyzers/architecture/index.js.map +1 -0
  18. package/dist/analyzers/architecture/pattern-detectors/base-detector.d.ts +27 -0
  19. package/dist/analyzers/architecture/pattern-detectors/base-detector.js +31 -0
  20. package/dist/analyzers/architecture/pattern-detectors/base-detector.js.map +1 -0
  21. package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.d.ts +11 -0
  22. package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.js +57 -0
  23. package/dist/analyzers/architecture/pattern-detectors/clean-architecture-detector.js.map +1 -0
  24. package/dist/analyzers/architecture/pattern-detectors/mvc-detector.d.ts +11 -0
  25. package/dist/analyzers/architecture/pattern-detectors/mvc-detector.js +43 -0
  26. package/dist/analyzers/architecture/pattern-detectors/mvc-detector.js.map +1 -0
  27. package/dist/analyzers/architecture/pattern-detectors/repository-detector.d.ts +11 -0
  28. package/dist/analyzers/architecture/pattern-detectors/repository-detector.js +49 -0
  29. package/dist/analyzers/architecture/pattern-detectors/repository-detector.js.map +1 -0
  30. package/dist/analyzers/architecture/project-structure-scanner.d.ts +54 -0
  31. package/dist/analyzers/architecture/project-structure-scanner.js +200 -0
  32. package/dist/analyzers/architecture/project-structure-scanner.js.map +1 -0
  33. package/dist/analyzers/best-practices/base-rule.d.ts +45 -0
  34. package/dist/analyzers/best-practices/base-rule.js +45 -0
  35. package/dist/analyzers/best-practices/base-rule.js.map +1 -0
  36. package/dist/analyzers/best-practices/best-practice-validator.d.ts +35 -0
  37. package/dist/analyzers/best-practices/best-practice-validator.js +181 -0
  38. package/dist/analyzers/best-practices/best-practice-validator.js.map +1 -0
  39. package/dist/analyzers/best-practices/rules/index.d.ts +7 -0
  40. package/dist/analyzers/best-practices/rules/index.js +56 -0
  41. package/dist/analyzers/best-practices/rules/index.js.map +1 -0
  42. package/dist/analyzers/best-practices/rules/typescript/consistent-naming.d.ts +17 -0
  43. package/dist/analyzers/best-practices/rules/typescript/consistent-naming.js +41 -0
  44. package/dist/analyzers/best-practices/rules/typescript/consistent-naming.js.map +1 -0
  45. package/dist/analyzers/best-practices/rules/typescript/function-complexity.d.ts +27 -0
  46. package/dist/analyzers/best-practices/rules/typescript/function-complexity.js +76 -0
  47. package/dist/analyzers/best-practices/rules/typescript/function-complexity.js.map +1 -0
  48. package/dist/analyzers/best-practices/rules/typescript/index.d.ts +15 -0
  49. package/dist/analyzers/best-practices/rules/typescript/index.js +16 -0
  50. package/dist/analyzers/best-practices/rules/typescript/index.js.map +1 -0
  51. package/dist/analyzers/best-practices/rules/typescript/max-file-length.d.ts +18 -0
  52. package/dist/analyzers/best-practices/rules/typescript/max-file-length.js +25 -0
  53. package/dist/analyzers/best-practices/rules/typescript/max-file-length.js.map +1 -0
  54. package/dist/analyzers/best-practices/rules/typescript/no-any-type.d.ts +17 -0
  55. package/dist/analyzers/best-practices/rules/typescript/no-any-type.js +27 -0
  56. package/dist/analyzers/best-practices/rules/typescript/no-any-type.js.map +1 -0
  57. package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.d.ts +18 -0
  58. package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.js +39 -0
  59. package/dist/analyzers/best-practices/rules/typescript/no-implicit-any.js.map +1 -0
  60. package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.d.ts +17 -0
  61. package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js +32 -0
  62. package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js.map +1 -0
  63. package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.d.ts +17 -0
  64. package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js +36 -0
  65. package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js.map +1 -0
  66. package/dist/analyzers/best-practices/rules/typescript/prefer-const.d.ts +17 -0
  67. package/dist/analyzers/best-practices/rules/typescript/prefer-const.js +33 -0
  68. package/dist/analyzers/best-practices/rules/typescript/prefer-const.js.map +1 -0
  69. package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.d.ts +17 -0
  70. package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js +34 -0
  71. package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js.map +1 -0
  72. package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.d.ts +17 -0
  73. package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.js +27 -0
  74. package/dist/analyzers/best-practices/rules/typescript/proper-error-handling.js.map +1 -0
  75. package/dist/analyzers/best-practices/types.d.ts +86 -0
  76. package/dist/analyzers/best-practices/types.js +7 -0
  77. package/dist/analyzers/best-practices/types.js.map +1 -0
  78. package/dist/analyzers/cache/analysis-cache.d.ts +41 -0
  79. package/dist/analyzers/cache/analysis-cache.js +84 -0
  80. package/dist/analyzers/cache/analysis-cache.js.map +1 -0
  81. package/dist/analyzers/errors.d.ts +51 -0
  82. package/dist/analyzers/errors.js +79 -0
  83. package/dist/analyzers/errors.js.map +1 -0
  84. package/dist/commands/doctor.js +2 -1
  85. package/dist/commands/doctor.js.map +1 -1
  86. package/dist/commands/mcp.js +243 -0
  87. package/dist/commands/mcp.js.map +1 -1
  88. package/dist/commands/setup.js +85 -28
  89. package/dist/commands/setup.js.map +1 -1
  90. package/dist/constants.d.ts +3 -0
  91. package/dist/constants.js +3 -0
  92. package/dist/constants.js.map +1 -1
  93. package/dist/hooks/use-input-handler.js +2 -1
  94. package/dist/hooks/use-input-handler.js.map +1 -1
  95. package/dist/llm/tools.js +86 -0
  96. package/dist/llm/tools.js.map +1 -1
  97. package/dist/mcp/client.d.ts +5 -0
  98. package/dist/mcp/client.js +55 -0
  99. package/dist/mcp/client.js.map +1 -1
  100. package/dist/mcp/health.d.ts +11 -2
  101. package/dist/mcp/health.js +35 -12
  102. package/dist/mcp/health.js.map +1 -1
  103. package/dist/mcp/reconnection.d.ts +93 -0
  104. package/dist/mcp/reconnection.js +216 -0
  105. package/dist/mcp/reconnection.js.map +1 -0
  106. package/dist/mcp/registry.d.ts +71 -0
  107. package/dist/mcp/registry.js +257 -0
  108. package/dist/mcp/registry.js.map +1 -0
  109. package/dist/mcp/resources.d.ts +53 -0
  110. package/dist/mcp/resources.js +135 -0
  111. package/dist/mcp/resources.js.map +1 -0
  112. package/dist/mcp/validation.d.ts +25 -0
  113. package/dist/mcp/validation.js +209 -0
  114. package/dist/mcp/validation.js.map +1 -0
  115. package/dist/memory/context-generator.js +1 -2
  116. package/dist/memory/context-generator.js.map +1 -1
  117. package/dist/planner/types.d.ts +2 -2
  118. package/dist/schemas/index.d.ts +4 -4
  119. package/dist/schemas/tool-schemas.d.ts +2 -2
  120. package/dist/schemas/yaml-schemas.d.ts +15 -0
  121. package/dist/schemas/yaml-schemas.js +3 -0
  122. package/dist/schemas/yaml-schemas.js.map +1 -1
  123. package/dist/sdk/index.d.ts +138 -0
  124. package/dist/sdk/index.js +173 -0
  125. package/dist/sdk/index.js.map +1 -0
  126. package/dist/sdk/types.d.ts +53 -0
  127. package/dist/sdk/types.js +8 -0
  128. package/dist/sdk/types.js.map +1 -0
  129. package/dist/tools/analysis-tools/architecture-tool.d.ts +46 -0
  130. package/dist/tools/analysis-tools/architecture-tool.js +124 -0
  131. package/dist/tools/analysis-tools/architecture-tool.js.map +1 -0
  132. package/dist/tools/analysis-tools/validation-tool.d.ts +51 -0
  133. package/dist/tools/analysis-tools/validation-tool.js +121 -0
  134. package/dist/tools/analysis-tools/validation-tool.js.map +1 -0
  135. package/dist/tools/web-search/cache.d.ts +62 -0
  136. package/dist/tools/web-search/cache.js +105 -0
  137. package/dist/tools/web-search/cache.js.map +1 -0
  138. package/dist/tools/web-search/engines/brave.d.ts +16 -0
  139. package/dist/tools/web-search/engines/brave.js +99 -0
  140. package/dist/tools/web-search/engines/brave.js.map +1 -0
  141. package/dist/tools/web-search/engines/crates.d.ts +19 -0
  142. package/dist/tools/web-search/engines/crates.js +87 -0
  143. package/dist/tools/web-search/engines/crates.js.map +1 -0
  144. package/dist/tools/web-search/engines/npm.d.ts +18 -0
  145. package/dist/tools/web-search/engines/npm.js +86 -0
  146. package/dist/tools/web-search/engines/npm.js.map +1 -0
  147. package/dist/tools/web-search/engines/pypi.d.ts +18 -0
  148. package/dist/tools/web-search/engines/pypi.js +75 -0
  149. package/dist/tools/web-search/engines/pypi.js.map +1 -0
  150. package/dist/tools/web-search/engines/tavily.d.ts +17 -0
  151. package/dist/tools/web-search/engines/tavily.js +73 -0
  152. package/dist/tools/web-search/engines/tavily.js.map +1 -0
  153. package/dist/tools/web-search/index.d.ts +13 -0
  154. package/dist/tools/web-search/index.js +13 -0
  155. package/dist/tools/web-search/index.js.map +1 -0
  156. package/dist/tools/web-search/router.d.ts +36 -0
  157. package/dist/tools/web-search/router.js +280 -0
  158. package/dist/tools/web-search/router.js.map +1 -0
  159. package/dist/tools/web-search/types.d.ts +45 -0
  160. package/dist/tools/web-search/types.js +6 -0
  161. package/dist/tools/web-search/types.js.map +1 -0
  162. package/dist/tools/web-search/web-search-tool.d.ts +51 -0
  163. package/dist/tools/web-search/web-search-tool.js +256 -0
  164. package/dist/tools/web-search/web-search-tool.js.map +1 -0
  165. package/dist/types/analysis.d.ts +177 -0
  166. package/dist/types/analysis.js +8 -0
  167. package/dist/types/analysis.js.map +1 -0
  168. package/dist/ui/components/chat-interface.js +11 -1
  169. package/dist/ui/components/chat-interface.js.map +1 -1
  170. package/dist/ui/components/keyboard-hints.js +2 -2
  171. package/dist/ui/components/keyboard-hints.js.map +1 -1
  172. package/dist/ui/components/status-bar.d.ts +1 -0
  173. package/dist/ui/components/status-bar.js +37 -39
  174. package/dist/ui/components/status-bar.js.map +1 -1
  175. package/dist/ui/components/toast-notification.js +2 -2
  176. package/dist/ui/components/toast-notification.js.map +1 -1
  177. package/dist/ui/components/welcome-panel.d.ts +1 -0
  178. package/dist/ui/components/welcome-panel.js +94 -11
  179. package/dist/ui/components/welcome-panel.js.map +1 -1
  180. package/dist/utils/analysis-logger.d.ts +47 -0
  181. package/dist/utils/analysis-logger.js +70 -0
  182. package/dist/utils/analysis-logger.js.map +1 -0
  183. package/dist/utils/automatosx-detector.d.ts +19 -0
  184. package/dist/utils/automatosx-detector.js +52 -0
  185. package/dist/utils/automatosx-detector.js.map +1 -0
  186. package/dist/utils/config-loader.d.ts +3 -0
  187. package/dist/utils/config-loader.js.map +1 -1
  188. package/dist/utils/confirmation-service.js +1 -1
  189. package/dist/utils/confirmation-service.js.map +1 -1
  190. package/dist/utils/init-previewer.js +26 -4
  191. package/dist/utils/init-previewer.js.map +1 -1
  192. package/package.json +19 -3
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Web Search Module
3
+ * Exports all web search functionality
4
+ */
5
+ export { WebSearchTool } from "./web-search-tool.js";
6
+ export { WebSearchRouter } from "./router.js";
7
+ export { SearchCache } from "./cache.js";
8
+ export { TavilySearch } from "./engines/tavily.js";
9
+ export { BraveSearch } from "./engines/brave.js";
10
+ export { NpmSearch } from "./engines/npm.js";
11
+ export { PyPISearch } from "./engines/pypi.js";
12
+ export { CratesSearch } from "./engines/crates.js";
13
+ export type { WebSearchResult, SearchOptions, SearchIntent, SearchEngine, SearchEngineResponse, } from "./types.js";
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Web Search Module
3
+ * Exports all web search functionality
4
+ */
5
+ export { WebSearchTool } from "./web-search-tool.js";
6
+ export { WebSearchRouter } from "./router.js";
7
+ export { SearchCache } from "./cache.js";
8
+ export { TavilySearch } from "./engines/tavily.js";
9
+ export { BraveSearch } from "./engines/brave.js";
10
+ export { NpmSearch } from "./engines/npm.js";
11
+ export { PyPISearch } from "./engines/pypi.js";
12
+ export { CratesSearch } from "./engines/crates.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/web-search/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Search Router
3
+ * Detects query intent and routes to appropriate search engines
4
+ */
5
+ import type { SearchEngine, SearchIntent } from "./types.js";
6
+ export declare class WebSearchRouter {
7
+ private tavilyEngine;
8
+ private braveEngine;
9
+ private npmEngine;
10
+ private pypiEngine;
11
+ private cratesEngine;
12
+ private readonly technicalKeywords;
13
+ private readonly codeKeywords;
14
+ private readonly packageKeywords;
15
+ private readonly pythonKeywords;
16
+ private readonly rustKeywords;
17
+ private readonly newsKeywords;
18
+ constructor();
19
+ /**
20
+ * Detect the intent of a search query
21
+ */
22
+ detectIntent(query: string): SearchIntent;
23
+ /**
24
+ * Select the best search engines for a given intent
25
+ */
26
+ selectEngines(intent: SearchIntent): SearchEngine[];
27
+ /**
28
+ * Get all available engines
29
+ */
30
+ getAvailableEngines(): SearchEngine[];
31
+ /**
32
+ * Check if any search engine is available
33
+ * Always returns true because package search engines require no API key
34
+ */
35
+ hasAvailableEngines(): boolean;
36
+ }
@@ -0,0 +1,280 @@
1
+ /**
2
+ * Search Router
3
+ * Detects query intent and routes to appropriate search engines
4
+ */
5
+ import { TavilySearch } from "./engines/tavily.js";
6
+ import { BraveSearch } from "./engines/brave.js";
7
+ import { NpmSearch } from "./engines/npm.js";
8
+ import { PyPISearch } from "./engines/pypi.js";
9
+ import { CratesSearch } from "./engines/crates.js";
10
+ export class WebSearchRouter {
11
+ tavilyEngine;
12
+ braveEngine;
13
+ npmEngine;
14
+ pypiEngine;
15
+ cratesEngine;
16
+ // Keywords for intent detection
17
+ technicalKeywords = [
18
+ "error",
19
+ "exception",
20
+ "bug",
21
+ "fix",
22
+ "debug",
23
+ "troubleshoot",
24
+ "code",
25
+ "function",
26
+ "method",
27
+ "class",
28
+ "api",
29
+ "library",
30
+ "framework",
31
+ "npm",
32
+ "package",
33
+ "install",
34
+ "configure",
35
+ "implementation",
36
+ "syntax",
37
+ "typescript",
38
+ "javascript",
39
+ "python",
40
+ "java",
41
+ "rust",
42
+ "go",
43
+ ];
44
+ codeKeywords = [
45
+ "code",
46
+ "example",
47
+ "implementation",
48
+ "snippet",
49
+ "sample",
50
+ "github",
51
+ "repository",
52
+ "source",
53
+ "function",
54
+ "class",
55
+ "how to",
56
+ "tutorial",
57
+ ];
58
+ packageKeywords = [
59
+ "package",
60
+ "npm",
61
+ "library",
62
+ "module",
63
+ "install",
64
+ "dependency",
65
+ "dependencies",
66
+ "node_modules",
67
+ "yarn",
68
+ "pnpm",
69
+ ];
70
+ pythonKeywords = [
71
+ "python",
72
+ "pip",
73
+ "pypi",
74
+ "django",
75
+ "flask",
76
+ "fastapi",
77
+ "pandas",
78
+ "numpy",
79
+ "pytest",
80
+ "virtualenv",
81
+ "conda",
82
+ "poetry",
83
+ ];
84
+ rustKeywords = [
85
+ "rust",
86
+ "cargo",
87
+ "crate",
88
+ "crates.io",
89
+ "rustc",
90
+ "tokio",
91
+ "serde",
92
+ "actix",
93
+ "wasm",
94
+ ];
95
+ newsKeywords = [
96
+ "news",
97
+ "latest",
98
+ "today",
99
+ "yesterday",
100
+ "recent",
101
+ "update",
102
+ "announcement",
103
+ "release",
104
+ "2025",
105
+ "2024",
106
+ "current",
107
+ "breaking",
108
+ "trending",
109
+ ];
110
+ constructor() {
111
+ this.tavilyEngine = new TavilySearch();
112
+ this.braveEngine = new BraveSearch();
113
+ this.npmEngine = new NpmSearch(); // Always available (no API key)
114
+ this.pypiEngine = new PyPISearch(); // Always available (no API key)
115
+ this.cratesEngine = new CratesSearch(); // Always available (no API key)
116
+ }
117
+ /**
118
+ * Detect the intent of a search query
119
+ */
120
+ detectIntent(query) {
121
+ const lowerQuery = query.toLowerCase();
122
+ const words = lowerQuery.split(/\s+/);
123
+ let technicalScore = 0;
124
+ let codeScore = 0;
125
+ let newsScore = 0;
126
+ let packageScore = 0;
127
+ let pythonScore = 0;
128
+ let rustScore = 0;
129
+ // Count keyword matches
130
+ for (const word of words) {
131
+ if (this.technicalKeywords.some((kw) => word.includes(kw))) {
132
+ technicalScore++;
133
+ }
134
+ if (this.codeKeywords.some((kw) => word.includes(kw))) {
135
+ codeScore++;
136
+ }
137
+ if (this.newsKeywords.some((kw) => word.includes(kw))) {
138
+ newsScore++;
139
+ }
140
+ if (this.packageKeywords.some((kw) => word.includes(kw))) {
141
+ packageScore++;
142
+ }
143
+ if (this.pythonKeywords.some((kw) => word.includes(kw))) {
144
+ pythonScore++;
145
+ }
146
+ if (this.rustKeywords.some((kw) => word.includes(kw))) {
147
+ rustScore++;
148
+ }
149
+ }
150
+ // Determine primary intent
151
+ let type = "general";
152
+ let confidence = 0.5; // Default confidence
153
+ let language = undefined;
154
+ // Detect language first
155
+ if (pythonScore > 0 && pythonScore >= rustScore) {
156
+ language = "python";
157
+ }
158
+ else if (rustScore > 0 && rustScore > pythonScore) {
159
+ language = "rust";
160
+ }
161
+ else if (packageScore > 0) {
162
+ language = "javascript"; // npm implies JavaScript
163
+ }
164
+ // Package search takes priority if npm keywords detected
165
+ if (packageScore > 0 || pythonScore > 0 || rustScore > 0) {
166
+ type = "technical"; // Packages are technical
167
+ confidence = Math.min((packageScore + pythonScore + rustScore) / words.length + 0.6, 1.0);
168
+ }
169
+ else if (newsScore > 0) {
170
+ type = "news";
171
+ confidence = Math.min(newsScore / words.length + 0.5, 1.0);
172
+ }
173
+ else if (codeScore > technicalScore) {
174
+ type = "code";
175
+ confidence = Math.min(codeScore / words.length + 0.5, 1.0);
176
+ }
177
+ else if (technicalScore > 0) {
178
+ type = "technical";
179
+ confidence = Math.min(technicalScore / words.length + 0.5, 1.0);
180
+ }
181
+ return {
182
+ type,
183
+ requiresTechnical: technicalScore > 0 || packageScore > 0 || pythonScore > 0 || rustScore > 0,
184
+ requiresCode: codeScore > 0,
185
+ requiresNews: newsScore > 0,
186
+ confidence,
187
+ language,
188
+ };
189
+ }
190
+ /**
191
+ * Select the best search engines for a given intent
192
+ */
193
+ selectEngines(intent) {
194
+ const engines = [];
195
+ // Check if query contains package keywords - prioritize language-specific search
196
+ const hasPackageIntent = intent.requiresTechnical && intent.confidence > 0.6;
197
+ // Select engines based on intent type
198
+ switch (intent.type) {
199
+ case "technical":
200
+ case "code":
201
+ // Route to language-specific package search
202
+ if (hasPackageIntent && intent.language) {
203
+ if (intent.language === "python") {
204
+ engines.push(this.pypiEngine); // Python packages
205
+ }
206
+ else if (intent.language === "rust") {
207
+ engines.push(this.cratesEngine); // Rust crates
208
+ }
209
+ else if (intent.language === "javascript") {
210
+ engines.push(this.npmEngine); // npm packages
211
+ }
212
+ }
213
+ else if (hasPackageIntent) {
214
+ // Default to npm if language not detected
215
+ engines.push(this.npmEngine);
216
+ }
217
+ // Tavily is great for technical queries
218
+ if (this.tavilyEngine.isAvailable()) {
219
+ engines.push(this.tavilyEngine);
220
+ }
221
+ // Brave as fallback
222
+ if (this.braveEngine.isAvailable() && engines.length === 0) {
223
+ engines.push(this.braveEngine);
224
+ }
225
+ break;
226
+ case "news":
227
+ // Brave has better news coverage
228
+ if (this.braveEngine.isAvailable()) {
229
+ engines.push(this.braveEngine);
230
+ }
231
+ // Tavily as fallback
232
+ if (this.tavilyEngine.isAvailable() && engines.length === 0) {
233
+ engines.push(this.tavilyEngine);
234
+ }
235
+ break;
236
+ case "general":
237
+ default:
238
+ // Tavily is optimized for AI/general queries
239
+ if (this.tavilyEngine.isAvailable()) {
240
+ engines.push(this.tavilyEngine);
241
+ }
242
+ // Brave as fallback
243
+ if (this.braveEngine.isAvailable() && engines.length === 0) {
244
+ engines.push(this.braveEngine);
245
+ }
246
+ break;
247
+ }
248
+ // Package search as ultimate fallback (always available, no API key needed)
249
+ // Prefer npm as it's most commonly used
250
+ if (engines.length === 0) {
251
+ engines.push(this.npmEngine);
252
+ }
253
+ return engines;
254
+ }
255
+ /**
256
+ * Get all available engines
257
+ */
258
+ getAvailableEngines() {
259
+ const engines = [];
260
+ if (this.tavilyEngine.isAvailable()) {
261
+ engines.push(this.tavilyEngine);
262
+ }
263
+ if (this.braveEngine.isAvailable()) {
264
+ engines.push(this.braveEngine);
265
+ }
266
+ // Package search engines are always available (no API key required)
267
+ engines.push(this.npmEngine);
268
+ engines.push(this.pypiEngine);
269
+ engines.push(this.cratesEngine);
270
+ return engines;
271
+ }
272
+ /**
273
+ * Check if any search engine is available
274
+ * Always returns true because package search engines require no API key
275
+ */
276
+ hasAvailableEngines() {
277
+ return true; // npm, PyPI, and crates.io search are always available
278
+ }
279
+ }
280
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/tools/web-search/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Web Search Types
3
+ * Common interfaces and types for web search functionality
4
+ */
5
+ export interface WebSearchResult {
6
+ title: string;
7
+ url: string;
8
+ snippet: string;
9
+ source: string;
10
+ relevanceScore?: number;
11
+ publishedDate?: string;
12
+ metadata?: Record<string, any>;
13
+ }
14
+ export interface SearchOptions {
15
+ maxResults?: number;
16
+ includeAnswer?: boolean;
17
+ searchDepth?: "basic" | "advanced";
18
+ freshness?: "day" | "week" | "month" | "year";
19
+ includeDomains?: string[];
20
+ excludeDomains?: string[];
21
+ timeout?: number;
22
+ }
23
+ export interface SearchIntent {
24
+ type: "general" | "technical" | "news" | "code";
25
+ requiresTechnical: boolean;
26
+ requiresCode: boolean;
27
+ requiresNews: boolean;
28
+ confidence: number;
29
+ language?: "javascript" | "python" | "rust";
30
+ }
31
+ export interface SearchEngine {
32
+ name: string;
33
+ search(query: string, options?: SearchOptions): Promise<WebSearchResult[]>;
34
+ isAvailable(): boolean;
35
+ getQuota?(): {
36
+ remaining: number;
37
+ limit: number;
38
+ };
39
+ }
40
+ export interface SearchEngineResponse {
41
+ results: WebSearchResult[];
42
+ answer?: string;
43
+ totalResults?: number;
44
+ query: string;
45
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Web Search Types
3
+ * Common interfaces and types for web search functionality
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tools/web-search/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Web Search Tool
3
+ * Main tool for web search functionality in AX CLI
4
+ */
5
+ import type { ToolResult } from "../../types/index.js";
6
+ import type { SearchOptions } from "./types.js";
7
+ export declare class WebSearchTool {
8
+ private router;
9
+ private cache;
10
+ private readonly DEFAULT_MAX_RESULTS;
11
+ private readonly MAX_RESULTS_LIMIT;
12
+ private readonly MAX_PARALLEL_ENGINES;
13
+ constructor();
14
+ /**
15
+ * Search the web for information
16
+ */
17
+ search(query: string, options?: SearchOptions): Promise<ToolResult>;
18
+ /**
19
+ * Sanitize search query to prevent injection attacks
20
+ */
21
+ private sanitizeQuery;
22
+ /**
23
+ * Aggregate and deduplicate results from multiple search engines
24
+ */
25
+ private aggregateResults;
26
+ /**
27
+ * Get bonus score for specific search engines
28
+ */
29
+ private getSourceBonus;
30
+ /**
31
+ * Format search results for display
32
+ */
33
+ private formatResults;
34
+ /**
35
+ * Get cache statistics (for debugging/monitoring)
36
+ */
37
+ getCacheStats(): {
38
+ keys: number;
39
+ hits: number;
40
+ misses: number;
41
+ hitRate: number;
42
+ };
43
+ /**
44
+ * Clear search cache
45
+ */
46
+ clearCache(): void;
47
+ /**
48
+ * Check if web search is available
49
+ */
50
+ isAvailable(): boolean;
51
+ }