@defai.digital/ax-cli 3.8.7 → 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.
Files changed (180) hide show
  1. package/README.md +28 -393
  2. package/config-defaults/settings.yaml +3 -0
  3. package/dist/agent/llm-agent.d.ts +11 -2
  4. package/dist/agent/llm-agent.js +73 -104
  5. package/dist/agent/llm-agent.js.map +1 -1
  6. package/dist/agent/loop-detector.d.ts +70 -0
  7. package/dist/agent/loop-detector.js +339 -0
  8. package/dist/agent/loop-detector.js.map +1 -0
  9. package/dist/agent/progress-tracker.d.ts +94 -0
  10. package/dist/agent/progress-tracker.js +222 -0
  11. package/dist/agent/progress-tracker.js.map +1 -0
  12. package/dist/agent/status-reporter.js +2 -2
  13. package/dist/agent/status-reporter.js.map +1 -1
  14. package/dist/agent/subagent.js +3 -3
  15. package/dist/agent/subagent.js.map +1 -1
  16. package/dist/analyzers/git/churn-calculator.js +2 -1
  17. package/dist/analyzers/git/churn-calculator.js.map +1 -1
  18. package/dist/checkpoint/storage.js +6 -4
  19. package/dist/checkpoint/storage.js.map +1 -1
  20. package/dist/commands/cache.js +8 -6
  21. package/dist/commands/cache.js.map +1 -1
  22. package/dist/commands/doctor.js +19 -27
  23. package/dist/commands/doctor.js.map +1 -1
  24. package/dist/commands/mcp-migrate.js +6 -5
  25. package/dist/commands/mcp-migrate.js.map +1 -1
  26. package/dist/commands/models.js +8 -12
  27. package/dist/commands/models.js.map +1 -1
  28. package/dist/commands/plan.js +1 -10
  29. package/dist/commands/plan.js.map +1 -1
  30. package/dist/commands/setup.js +2 -1
  31. package/dist/commands/setup.js.map +1 -1
  32. package/dist/commands/status.js +4 -4
  33. package/dist/commands/status.js.map +1 -1
  34. package/dist/constants.d.ts +12 -0
  35. package/dist/constants.js +16 -4
  36. package/dist/constants.js.map +1 -1
  37. package/dist/hooks/hook-runner.d.ts +138 -0
  38. package/dist/hooks/hook-runner.js +429 -0
  39. package/dist/hooks/hook-runner.js.map +1 -0
  40. package/dist/hooks/index.d.ts +6 -0
  41. package/dist/hooks/index.js +7 -0
  42. package/dist/hooks/index.js.map +1 -0
  43. package/dist/index.js +1 -19
  44. package/dist/index.js.map +1 -1
  45. package/dist/llm/tools.js +2 -39
  46. package/dist/llm/tools.js.map +1 -1
  47. package/dist/mcp/automatosx-loader.js +2 -1
  48. package/dist/mcp/automatosx-loader.js.map +1 -1
  49. package/dist/mcp/config-migrator.js +3 -2
  50. package/dist/mcp/config-migrator.js.map +1 -1
  51. package/dist/mcp/config-v2.d.ts +5 -0
  52. package/dist/mcp/config-v2.js +26 -0
  53. package/dist/mcp/config-v2.js.map +1 -1
  54. package/dist/mcp/error-formatter.js +4 -1
  55. package/dist/mcp/error-formatter.js.map +1 -1
  56. package/dist/mcp/reconnection.js +2 -1
  57. package/dist/mcp/reconnection.js.map +1 -1
  58. package/dist/mcp/registry.js +3 -2
  59. package/dist/mcp/registry.js.map +1 -1
  60. package/dist/mcp/resources.js +2 -1
  61. package/dist/mcp/resources.js.map +1 -1
  62. package/dist/mcp/validation.js +9 -0
  63. package/dist/mcp/validation.js.map +1 -1
  64. package/dist/memory/context-store.js +4 -6
  65. package/dist/memory/context-store.js.map +1 -1
  66. package/dist/memory/types.d.ts +2 -0
  67. package/dist/memory/types.js +4 -1
  68. package/dist/memory/types.js.map +1 -1
  69. package/dist/permissions/index.d.ts +6 -0
  70. package/dist/permissions/index.js +7 -0
  71. package/dist/permissions/index.js.map +1 -0
  72. package/dist/permissions/permission-manager.d.ts +145 -0
  73. package/dist/permissions/permission-manager.js +401 -0
  74. package/dist/permissions/permission-manager.js.map +1 -0
  75. package/dist/planner/task-planner.js +2 -1
  76. package/dist/planner/task-planner.js.map +1 -1
  77. package/dist/schemas/index.d.ts +2 -2
  78. package/dist/schemas/settings-schemas.d.ts +0 -14
  79. package/dist/schemas/settings-schemas.js +0 -10
  80. package/dist/schemas/settings-schemas.js.map +1 -1
  81. package/dist/schemas/tool-schemas.d.ts +2 -2
  82. package/dist/schemas/yaml-schemas.d.ts +15 -0
  83. package/dist/schemas/yaml-schemas.js +3 -0
  84. package/dist/schemas/yaml-schemas.js.map +1 -1
  85. package/dist/tools/bash.js +6 -5
  86. package/dist/tools/bash.js.map +1 -1
  87. package/dist/tools/confirmation-tool.js +3 -2
  88. package/dist/tools/confirmation-tool.js.map +1 -1
  89. package/dist/tools/registry.d.ts +1 -1
  90. package/dist/tools/registry.js +2 -1
  91. package/dist/tools/registry.js.map +1 -1
  92. package/dist/tools/todo-tool.js +3 -2
  93. package/dist/tools/todo-tool.js.map +1 -1
  94. package/dist/ui/components/tool-group-display.js +0 -6
  95. package/dist/ui/components/tool-group-display.js.map +1 -1
  96. package/dist/ui/hooks/use-input-handler.js +7 -6
  97. package/dist/ui/hooks/use-input-handler.js.map +1 -1
  98. package/dist/ui/hooks/use-input-history.js +4 -4
  99. package/dist/ui/hooks/use-input-history.js.map +1 -1
  100. package/dist/ui/utils/tool-grouper.d.ts +1 -2
  101. package/dist/ui/utils/tool-grouper.js +4 -15
  102. package/dist/ui/utils/tool-grouper.js.map +1 -1
  103. package/dist/utils/audit-logger.js +2 -1
  104. package/dist/utils/audit-logger.js.map +1 -1
  105. package/dist/utils/config-loader.d.ts +3 -0
  106. package/dist/utils/config-loader.js.map +1 -1
  107. package/dist/utils/encryption.js +2 -1
  108. package/dist/utils/encryption.js.map +1 -1
  109. package/dist/utils/file-cache.js +4 -2
  110. package/dist/utils/file-cache.js.map +1 -1
  111. package/dist/utils/onboarding-manager.js +2 -1
  112. package/dist/utils/onboarding-manager.js.map +1 -1
  113. package/dist/utils/path-helpers.js +3 -2
  114. package/dist/utils/path-helpers.js.map +1 -1
  115. package/dist/utils/path-security.js +3 -2
  116. package/dist/utils/path-security.js.map +1 -1
  117. package/dist/utils/settings-manager.d.ts +1 -21
  118. package/dist/utils/settings-manager.js +2 -82
  119. package/dist/utils/settings-manager.js.map +1 -1
  120. package/dist/utils/streaming-analyzer.d.ts +2 -13
  121. package/dist/utils/streaming-analyzer.js +3 -25
  122. package/dist/utils/streaming-analyzer.js.map +1 -1
  123. package/dist/utils/token-counter.d.ts +8 -1
  124. package/dist/utils/token-counter.js +14 -5
  125. package/dist/utils/token-counter.js.map +1 -1
  126. package/package.json +3 -2
  127. package/packages/schemas/README.md +1 -1
  128. package/packages/schemas/package.json +1 -1
  129. package/.ax-cli/CUSTOM.md +0 -97
  130. package/.ax-cli/auto-accept-audit.json +0 -1302
  131. package/.ax-cli/index.json +0 -43
  132. package/.ax-cli/memory.json +0 -55
  133. package/.ax-cli/settings.json +0 -12
  134. package/ax.config.json +0 -303
  135. package/dist/tools/web-search/cache.d.ts +0 -62
  136. package/dist/tools/web-search/cache.js +0 -105
  137. package/dist/tools/web-search/cache.js.map +0 -1
  138. package/dist/tools/web-search/engines/crates.d.ts +0 -19
  139. package/dist/tools/web-search/engines/crates.js +0 -87
  140. package/dist/tools/web-search/engines/crates.js.map +0 -1
  141. package/dist/tools/web-search/engines/npm.d.ts +0 -18
  142. package/dist/tools/web-search/engines/npm.js +0 -86
  143. package/dist/tools/web-search/engines/npm.js.map +0 -1
  144. package/dist/tools/web-search/engines/pypi.d.ts +0 -18
  145. package/dist/tools/web-search/engines/pypi.js +0 -75
  146. package/dist/tools/web-search/engines/pypi.js.map +0 -1
  147. package/dist/tools/web-search/engines/stackoverflow.d.ts +0 -30
  148. package/dist/tools/web-search/engines/stackoverflow.js +0 -130
  149. package/dist/tools/web-search/engines/stackoverflow.js.map +0 -1
  150. package/dist/tools/web-search/engines/wikipedia.d.ts +0 -27
  151. package/dist/tools/web-search/engines/wikipedia.js +0 -112
  152. package/dist/tools/web-search/engines/wikipedia.js.map +0 -1
  153. package/dist/tools/web-search/index.d.ts +0 -11
  154. package/dist/tools/web-search/index.js +0 -11
  155. package/dist/tools/web-search/index.js.map +0 -1
  156. package/dist/tools/web-search/router.d.ts +0 -36
  157. package/dist/tools/web-search/router.js +0 -270
  158. package/dist/tools/web-search/router.js.map +0 -1
  159. package/dist/tools/web-search/types.d.ts +0 -45
  160. package/dist/tools/web-search/types.js +0 -6
  161. package/dist/tools/web-search/types.js.map +0 -1
  162. package/dist/tools/web-search/web-search-tool.d.ts +0 -51
  163. package/dist/tools/web-search/web-search-tool.js +0 -262
  164. package/dist/tools/web-search/web-search-tool.js.map +0 -1
  165. package/packages/schemas/dist/index.d.ts +0 -14
  166. package/packages/schemas/dist/index.d.ts.map +0 -1
  167. package/packages/schemas/dist/index.js +0 -19
  168. package/packages/schemas/dist/index.js.map +0 -1
  169. package/packages/schemas/dist/public/core/brand-types.d.ts +0 -308
  170. package/packages/schemas/dist/public/core/brand-types.d.ts.map +0 -1
  171. package/packages/schemas/dist/public/core/brand-types.js +0 -243
  172. package/packages/schemas/dist/public/core/brand-types.js.map +0 -1
  173. package/packages/schemas/dist/public/core/enums.d.ts +0 -227
  174. package/packages/schemas/dist/public/core/enums.d.ts.map +0 -1
  175. package/packages/schemas/dist/public/core/enums.js +0 -222
  176. package/packages/schemas/dist/public/core/enums.js.map +0 -1
  177. package/packages/schemas/dist/public/core/id-types.d.ts +0 -286
  178. package/packages/schemas/dist/public/core/id-types.d.ts.map +0 -1
  179. package/packages/schemas/dist/public/core/id-types.js +0 -136
  180. package/packages/schemas/dist/public/core/id-types.js.map +0 -1
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"npm.js","sourceRoot":"","sources":["../../../../src/tools/web-search/engines/npm.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- /**
2
- * PyPI (Python Package Index) Search Engine
3
- * Free, unlimited search for Python packages
4
- * No API key required
5
- */
6
- import type { SearchEngine, WebSearchResult, SearchOptions } from "../types.js";
7
- export declare class PyPISearch implements SearchEngine {
8
- readonly name = "pypi";
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 formatResult;
17
- private createSnippet;
18
- }
@@ -1,75 +0,0 @@
1
- /**
2
- * PyPI (Python Package Index) Search Engine
3
- * Free, unlimited search for Python packages
4
- * No API key required
5
- */
6
- import axios from "axios";
7
- // Note: PyPI's search API is being rebuilt, so we use direct package lookup instead
8
- export class PyPISearch {
9
- name = "pypi";
10
- baseUrl = "https://pypi.org/pypi";
11
- timeout = 10000; // 10 second timeout
12
- /**
13
- * Always available - no API key required
14
- */
15
- isAvailable() {
16
- return true;
17
- }
18
- async search(query, options) {
19
- try {
20
- // PyPI's official search is being rebuilt, so we use direct package lookup
21
- // Try to fetch package info directly
22
- const packageResponse = await axios.get(`${this.baseUrl}/${encodeURIComponent(query)}/json`, {
23
- timeout: options?.timeout || this.timeout,
24
- validateStatus: (status) => status === 200 || status === 404,
25
- });
26
- if (packageResponse.status === 404) {
27
- // Package not found, return empty results
28
- return [];
29
- }
30
- return this.formatResult(packageResponse.data);
31
- }
32
- catch (error) {
33
- // Return empty results on error rather than failing
34
- // PyPI search is a best-effort feature
35
- return [];
36
- }
37
- }
38
- formatResult(data) {
39
- if (!data.info)
40
- return [];
41
- const info = data.info;
42
- return [
43
- {
44
- title: info.name,
45
- url: `https://pypi.org/project/${info.name}/`,
46
- snippet: this.createSnippet(info),
47
- source: this.name,
48
- relevanceScore: 100, // Exact match
49
- publishedDate: info.release_date,
50
- metadata: {
51
- version: info.version,
52
- author: info.author,
53
- license: info.license,
54
- homepage: info.home_page || info.project_urls?.Homepage,
55
- requiresPython: info.requires_python,
56
- },
57
- },
58
- ];
59
- }
60
- createSnippet(info) {
61
- const parts = [];
62
- if (info.summary) {
63
- parts.push(info.summary);
64
- }
65
- parts.push(`v${info.version}`);
66
- if (info.author) {
67
- parts.push(`by ${info.author}`);
68
- }
69
- if (info.license) {
70
- parts.push(`License: ${info.license}`);
71
- }
72
- return parts.join(" • ");
73
- }
74
- }
75
- //# sourceMappingURL=pypi.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pypi.js","sourceRoot":"","sources":["../../../../src/tools/web-search/engines/pypi.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,oFAAoF;AAEpF,MAAM,OAAO,UAAU;IACL,IAAI,GAAG,MAAM,CAAC;IACtB,OAAO,GAAG,uBAAuB,CAAC;IAClC,OAAO,GAAG,KAAK,CAAC,CAAC,oBAAoB;IAE7C;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CACV,KAAa,EACb,OAAuB;QAEvB,IAAI,CAAC;YACH,2EAA2E;YAC3E,qCAAqC;YACrC,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,GAAG,CACrC,GAAG,IAAI,CAAC,OAAO,IAAI,kBAAkB,CAAC,KAAK,CAAC,OAAO,EACnD;gBACE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO;gBACzC,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;aAC7D,CACF,CAAC;YAEF,IAAI,eAAe,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnC,0CAA0C;gBAC1C,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,OAAO,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,oDAAoD;YACpD,uCAAuC;YACvC,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,IAAS;QAC5B,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QAE1B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,OAAO;YACL;gBACE,KAAK,EAAE,IAAI,CAAC,IAAI;gBAChB,GAAG,EAAE,4BAA4B,IAAI,CAAC,IAAI,GAAG;gBAC7C,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBACjC,MAAM,EAAE,IAAI,CAAC,IAAI;gBACjB,cAAc,EAAE,GAAG,EAAE,cAAc;gBACnC,aAAa,EAAE,IAAI,CAAC,YAAY;gBAChC,QAAQ,EAAE;oBACR,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,EAAE,QAAQ;oBACvD,cAAc,EAAE,IAAI,CAAC,eAAe;iBACrC;aACF;SACF,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,IAAS;QAC7B,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAE/B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;CACF"}
@@ -1,30 +0,0 @@
1
- /**
2
- * Stack Overflow Search Engine
3
- * Free API with 300 requests/day without API key
4
- * Excellent for "how to" and error troubleshooting queries
5
- */
6
- import type { SearchEngine, WebSearchResult, SearchOptions } from "../types.js";
7
- export declare class StackOverflowSearch implements SearchEngine {
8
- readonly name = "stackoverflow";
9
- private baseUrl;
10
- private timeout;
11
- private quotaRemaining;
12
- /**
13
- * Available if we have quota remaining
14
- */
15
- isAvailable(): boolean;
16
- /**
17
- * Get current quota status
18
- */
19
- getQuota(): {
20
- remaining: number;
21
- limit: number;
22
- };
23
- search(query: string, options?: SearchOptions): Promise<WebSearchResult[]>;
24
- private formatResults;
25
- private createSnippet;
26
- /**
27
- * Decode HTML entities in Stack Overflow responses
28
- */
29
- private decodeHtml;
30
- }
@@ -1,130 +0,0 @@
1
- /**
2
- * Stack Overflow Search Engine
3
- * Free API with 300 requests/day without API key
4
- * Excellent for "how to" and error troubleshooting queries
5
- */
6
- import axios from "axios";
7
- export class StackOverflowSearch {
8
- name = "stackoverflow";
9
- baseUrl = "https://api.stackexchange.com/2.3";
10
- timeout = 10000;
11
- quotaRemaining = 300;
12
- /**
13
- * Available if we have quota remaining
14
- */
15
- isAvailable() {
16
- return this.quotaRemaining > 0;
17
- }
18
- /**
19
- * Get current quota status
20
- */
21
- getQuota() {
22
- return { remaining: this.quotaRemaining, limit: 300 };
23
- }
24
- async search(query, options) {
25
- // Skip if quota exhausted
26
- if (this.quotaRemaining <= 0) {
27
- return [];
28
- }
29
- try {
30
- const params = new URLSearchParams({
31
- order: "desc",
32
- sort: "relevance",
33
- q: query,
34
- site: "stackoverflow",
35
- pagesize: Math.min(options?.maxResults || 5, 10).toString(),
36
- filter: "!nNPvSNVZJS", // Lightweight filter with excerpt
37
- });
38
- const response = await axios.get(`${this.baseUrl}/search/excerpts?${params.toString()}`, {
39
- timeout: options?.timeout || this.timeout,
40
- headers: {
41
- "User-Agent": "ax-cli",
42
- Accept: "application/json",
43
- },
44
- });
45
- // Validate response structure
46
- if (!response.data || !Array.isArray(response.data.items)) {
47
- return [];
48
- }
49
- // Update quota from response
50
- if (response.data.quota_remaining !== undefined) {
51
- this.quotaRemaining = response.data.quota_remaining;
52
- }
53
- return this.formatResults(response.data);
54
- }
55
- catch (error) {
56
- if (axios.isAxiosError(error)) {
57
- // Handle throttling (HTTP 400 with backoff)
58
- if (error.response?.status === 400) {
59
- const backoff = error.response.data?.backoff;
60
- if (backoff) {
61
- console.warn(`Stack Overflow API throttled, backoff: ${backoff}s`);
62
- }
63
- }
64
- if (error.code === "ECONNABORTED") {
65
- // Timeout - return empty, don't crash
66
- return [];
67
- }
68
- }
69
- // Graceful failure - return empty results
70
- return [];
71
- }
72
- }
73
- formatResults(response) {
74
- return response.items.map((item) => ({
75
- title: this.decodeHtml(item.title),
76
- url: item.link,
77
- snippet: this.createSnippet(item),
78
- source: this.name,
79
- relevanceScore: item.score,
80
- metadata: {
81
- score: item.score,
82
- answerCount: item.answer_count,
83
- isAnswered: item.is_answered,
84
- tags: item.tags,
85
- questionId: item.question_id,
86
- },
87
- }));
88
- }
89
- createSnippet(item) {
90
- const parts = [];
91
- // Add excerpt if available (decode first, then slice to avoid cutting HTML entities)
92
- if (item.excerpt) {
93
- const decoded = this.decodeHtml(item.excerpt);
94
- parts.push(decoded.slice(0, 200));
95
- }
96
- // Add answer status
97
- if (item.is_answered) {
98
- parts.push(`✓ Answered (${item.answer_count} answers)`);
99
- }
100
- else if (item.answer_count > 0) {
101
- parts.push(`${item.answer_count} answers`);
102
- }
103
- else {
104
- parts.push("No answers yet");
105
- }
106
- // Add score
107
- if (item.score > 0) {
108
- parts.push(`+${item.score} votes`);
109
- }
110
- // Add top tags
111
- if (item.tags && item.tags.length > 0) {
112
- parts.push(`[${item.tags.slice(0, 3).join(", ")}]`);
113
- }
114
- return parts.join(" • ");
115
- }
116
- /**
117
- * Decode HTML entities in Stack Overflow responses
118
- */
119
- decodeHtml(html) {
120
- return html
121
- .replace(/&amp;/g, "&")
122
- .replace(/&lt;/g, "<")
123
- .replace(/&gt;/g, ">")
124
- .replace(/&quot;/g, '"')
125
- .replace(/&#39;/g, "'")
126
- .replace(/&nbsp;/g, " ")
127
- .replace(/<[^>]*>/g, ""); // Strip HTML tags
128
- }
129
- }
130
- //# sourceMappingURL=stackoverflow.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stackoverflow.js","sourceRoot":"","sources":["../../../../src/tools/web-search/engines/stackoverflow.ts"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- /**
2
- * Wikipedia Search Engine
3
- * Free API with effectively unlimited requests (200/s)
4
- * Excellent for "what is" and concept explanation queries
5
- */
6
- import type { SearchEngine, WebSearchResult, SearchOptions } from "../types.js";
7
- export declare class WikipediaSearch implements SearchEngine {
8
- readonly name = "wikipedia";
9
- private baseUrl;
10
- private timeout;
11
- /**
12
- * Always available - no API key or quota limits
13
- */
14
- isAvailable(): boolean;
15
- search(query: string, options?: SearchOptions): Promise<WebSearchResult[]>;
16
- private formatResults;
17
- /**
18
- * Build Wikipedia article URL from title
19
- * Wikipedia URLs use underscores for spaces but don't need full URI encoding
20
- */
21
- private buildWikipediaUrl;
22
- private createSnippet;
23
- /**
24
- * Strip HTML tags and decode entities from Wikipedia snippets
25
- */
26
- private stripHtml;
27
- }
@@ -1,112 +0,0 @@
1
- /**
2
- * Wikipedia Search Engine
3
- * Free API with effectively unlimited requests (200/s)
4
- * Excellent for "what is" and concept explanation queries
5
- */
6
- import axios from "axios";
7
- export class WikipediaSearch {
8
- name = "wikipedia";
9
- baseUrl = "https://en.wikipedia.org/w/api.php";
10
- timeout = 10000;
11
- /**
12
- * Always available - no API key or quota limits
13
- */
14
- isAvailable() {
15
- return true;
16
- }
17
- async search(query, options) {
18
- try {
19
- const params = new URLSearchParams({
20
- action: "query",
21
- list: "search",
22
- srsearch: query,
23
- srlimit: Math.min(options?.maxResults || 5, 10).toString(),
24
- srprop: "snippet|wordcount|timestamp",
25
- format: "json",
26
- origin: "*", // Enable CORS
27
- });
28
- const response = await axios.get(`${this.baseUrl}?${params.toString()}`, {
29
- timeout: options?.timeout || this.timeout,
30
- headers: {
31
- "User-Agent": "ax-cli",
32
- Accept: "application/json",
33
- },
34
- });
35
- // Validate response structure to prevent crashes on malformed responses
36
- if (!response.data) {
37
- return [];
38
- }
39
- const searchResults = response.data.query?.search || [];
40
- return this.formatResults(searchResults);
41
- }
42
- catch (error) {
43
- if (axios.isAxiosError(error)) {
44
- if (error.code === "ECONNABORTED") {
45
- // Timeout - return empty, don't crash
46
- return [];
47
- }
48
- }
49
- // Graceful failure - return empty results
50
- return [];
51
- }
52
- }
53
- formatResults(results) {
54
- return results.map((item) => ({
55
- title: item.title,
56
- url: this.buildWikipediaUrl(item.title),
57
- snippet: this.createSnippet(item),
58
- source: this.name,
59
- publishedDate: item.timestamp?.split("T")[0],
60
- metadata: {
61
- pageId: item.pageid,
62
- wordcount: item.wordcount,
63
- namespace: item.ns,
64
- },
65
- }));
66
- }
67
- /**
68
- * Build Wikipedia article URL from title
69
- * Wikipedia URLs use underscores for spaces but don't need full URI encoding
70
- */
71
- buildWikipediaUrl(title) {
72
- // Replace spaces with underscores (Wikipedia convention)
73
- // Only encode characters that are invalid in URLs, not underscores
74
- const urlTitle = title
75
- .replace(/ /g, "_")
76
- .replace(/[?#]/g, (c) => encodeURIComponent(c)); // Only encode URL-breaking chars
77
- return `https://en.wikipedia.org/wiki/${urlTitle}`;
78
- }
79
- createSnippet(item) {
80
- const parts = [];
81
- // Add cleaned snippet
82
- if (item.snippet) {
83
- parts.push(this.stripHtml(item.snippet));
84
- }
85
- // Add word count for context
86
- if (item.wordcount) {
87
- if (item.wordcount > 5000) {
88
- parts.push("(detailed article)");
89
- }
90
- else if (item.wordcount > 1000) {
91
- parts.push("(comprehensive)");
92
- }
93
- }
94
- return parts.join(" ");
95
- }
96
- /**
97
- * Strip HTML tags and decode entities from Wikipedia snippets
98
- */
99
- stripHtml(html) {
100
- return html
101
- .replace(/<span class="searchmatch">([^<]*)<\/span>/g, "$1") // Remove search highlighting
102
- .replace(/<[^>]*>/g, "") // Strip remaining HTML tags
103
- .replace(/&amp;/g, "&")
104
- .replace(/&lt;/g, "<")
105
- .replace(/&gt;/g, ">")
106
- .replace(/&quot;/g, '"')
107
- .replace(/&#39;/g, "'")
108
- .replace(/&nbsp;/g, " ")
109
- .trim();
110
- }
111
- }
112
- //# sourceMappingURL=wikipedia.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wikipedia.js","sourceRoot":"","sources":["../../../../src/tools/web-search/engines/wikipedia.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
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 { NpmSearch } from "./engines/npm.js";
9
- export { PyPISearch } from "./engines/pypi.js";
10
- export { CratesSearch } from "./engines/crates.js";
11
- export type { WebSearchResult, SearchOptions, SearchIntent, SearchEngine, SearchEngineResponse, } from "./types.js";
@@ -1,11 +0,0 @@
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 { NpmSearch } from "./engines/npm.js";
9
- export { PyPISearch } from "./engines/pypi.js";
10
- export { CratesSearch } from "./engines/crates.js";
11
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
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,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}