@zds-ai/cli 0.1.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 (204) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +497 -0
  3. package/dist/agent/grok-agent.d.ts +250 -0
  4. package/dist/agent/grok-agent.js +2480 -0
  5. package/dist/agent/grok-agent.js.map +1 -0
  6. package/dist/agent/index.d.ts +14 -0
  7. package/dist/agent/index.js +136 -0
  8. package/dist/agent/index.js.map +1 -0
  9. package/dist/commands/mcp.d.ts +2 -0
  10. package/dist/commands/mcp.js +239 -0
  11. package/dist/commands/mcp.js.map +1 -0
  12. package/dist/grok/client.d.ts +55 -0
  13. package/dist/grok/client.js +276 -0
  14. package/dist/grok/client.js.map +1 -0
  15. package/dist/grok/tools.d.ts +8 -0
  16. package/dist/grok/tools.js +878 -0
  17. package/dist/grok/tools.js.map +1 -0
  18. package/dist/hooks/use-enhanced-input.d.ts +38 -0
  19. package/dist/hooks/use-enhanced-input.js +228 -0
  20. package/dist/hooks/use-enhanced-input.js.map +1 -0
  21. package/dist/hooks/use-input-handler.d.ts +36 -0
  22. package/dist/hooks/use-input-handler.js +1099 -0
  23. package/dist/hooks/use-input-handler.js.map +1 -0
  24. package/dist/hooks/use-input-history.d.ts +9 -0
  25. package/dist/hooks/use-input-history.js +61 -0
  26. package/dist/hooks/use-input-history.js.map +1 -0
  27. package/dist/index.d.ts +2 -0
  28. package/dist/index.js +869 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/mcp/client.d.ts +41 -0
  31. package/dist/mcp/client.js +224 -0
  32. package/dist/mcp/client.js.map +1 -0
  33. package/dist/mcp/config.d.ts +13 -0
  34. package/dist/mcp/config.js +56 -0
  35. package/dist/mcp/config.js.map +1 -0
  36. package/dist/mcp/transports.d.ts +53 -0
  37. package/dist/mcp/transports.js +256 -0
  38. package/dist/mcp/transports.js.map +1 -0
  39. package/dist/tools/character-tool.d.ts +27 -0
  40. package/dist/tools/character-tool.js +194 -0
  41. package/dist/tools/character-tool.js.map +1 -0
  42. package/dist/tools/clear-cache-tool.d.ts +14 -0
  43. package/dist/tools/clear-cache-tool.js +82 -0
  44. package/dist/tools/clear-cache-tool.js.map +1 -0
  45. package/dist/tools/confirmation-tool.d.ts +16 -0
  46. package/dist/tools/confirmation-tool.js +72 -0
  47. package/dist/tools/confirmation-tool.js.map +1 -0
  48. package/dist/tools/env-tool.d.ts +17 -0
  49. package/dist/tools/env-tool.js +89 -0
  50. package/dist/tools/env-tool.js.map +1 -0
  51. package/dist/tools/file-conversion-tool.d.ts +16 -0
  52. package/dist/tools/file-conversion-tool.js +181 -0
  53. package/dist/tools/file-conversion-tool.js.map +1 -0
  54. package/dist/tools/image-tool.d.ts +22 -0
  55. package/dist/tools/image-tool.js +268 -0
  56. package/dist/tools/image-tool.js.map +1 -0
  57. package/dist/tools/index.d.ts +14 -0
  58. package/dist/tools/index.js +15 -0
  59. package/dist/tools/index.js.map +1 -0
  60. package/dist/tools/internet-tool.d.ts +11 -0
  61. package/dist/tools/internet-tool.js +108 -0
  62. package/dist/tools/internet-tool.js.map +1 -0
  63. package/dist/tools/introspect-tool.d.ts +11 -0
  64. package/dist/tools/introspect-tool.js +243 -0
  65. package/dist/tools/introspect-tool.js.map +1 -0
  66. package/dist/tools/morph-editor.d.ts +38 -0
  67. package/dist/tools/morph-editor.js +318 -0
  68. package/dist/tools/morph-editor.js.map +1 -0
  69. package/dist/tools/restart-tool.d.ts +7 -0
  70. package/dist/tools/restart-tool.js +24 -0
  71. package/dist/tools/restart-tool.js.map +1 -0
  72. package/dist/tools/search.d.ts +71 -0
  73. package/dist/tools/search.js +340 -0
  74. package/dist/tools/search.js.map +1 -0
  75. package/dist/tools/task-tool.d.ts +19 -0
  76. package/dist/tools/task-tool.js +115 -0
  77. package/dist/tools/task-tool.js.map +1 -0
  78. package/dist/tools/text-editor.d.ts +35 -0
  79. package/dist/tools/text-editor.js +669 -0
  80. package/dist/tools/text-editor.js.map +1 -0
  81. package/dist/tools/tool-discovery.d.ts +20 -0
  82. package/dist/tools/tool-discovery.js +45 -0
  83. package/dist/tools/tool-discovery.js.map +1 -0
  84. package/dist/tools/zsh.d.ts +13 -0
  85. package/dist/tools/zsh.js +168 -0
  86. package/dist/tools/zsh.js.map +1 -0
  87. package/dist/types/index.d.ts +31 -0
  88. package/dist/types/index.js +2 -0
  89. package/dist/types/index.js.map +1 -0
  90. package/dist/ui/app.d.ts +7 -0
  91. package/dist/ui/app.js +99 -0
  92. package/dist/ui/app.js.map +1 -0
  93. package/dist/ui/components/active-task-status.d.ts +7 -0
  94. package/dist/ui/components/active-task-status.js +37 -0
  95. package/dist/ui/components/active-task-status.js.map +1 -0
  96. package/dist/ui/components/api-key-input.d.ts +7 -0
  97. package/dist/ui/components/api-key-input.js +80 -0
  98. package/dist/ui/components/api-key-input.js.map +1 -0
  99. package/dist/ui/components/backend-status.d.ts +7 -0
  100. package/dist/ui/components/backend-status.js +85 -0
  101. package/dist/ui/components/backend-status.js.map +1 -0
  102. package/dist/ui/components/chat-history.d.ts +8 -0
  103. package/dist/ui/components/chat-history.js +187 -0
  104. package/dist/ui/components/chat-history.js.map +1 -0
  105. package/dist/ui/components/chat-input.d.ts +9 -0
  106. package/dist/ui/components/chat-input.js +63 -0
  107. package/dist/ui/components/chat-input.js.map +1 -0
  108. package/dist/ui/components/chat-interface.d.ts +9 -0
  109. package/dist/ui/components/chat-interface.js +389 -0
  110. package/dist/ui/components/chat-interface.js.map +1 -0
  111. package/dist/ui/components/command-suggestions.d.ts +17 -0
  112. package/dist/ui/components/command-suggestions.js +22 -0
  113. package/dist/ui/components/command-suggestions.js.map +1 -0
  114. package/dist/ui/components/confirmation-dialog.d.ts +11 -0
  115. package/dist/ui/components/confirmation-dialog.js +105 -0
  116. package/dist/ui/components/confirmation-dialog.js.map +1 -0
  117. package/dist/ui/components/context-status.d.ts +7 -0
  118. package/dist/ui/components/context-status.js +36 -0
  119. package/dist/ui/components/context-status.js.map +1 -0
  120. package/dist/ui/components/diff-renderer.d.ts +13 -0
  121. package/dist/ui/components/diff-renderer.js +206 -0
  122. package/dist/ui/components/diff-renderer.js.map +1 -0
  123. package/dist/ui/components/loading-spinner.d.ts +8 -0
  124. package/dist/ui/components/loading-spinner.js +64 -0
  125. package/dist/ui/components/loading-spinner.js.map +1 -0
  126. package/dist/ui/components/mcp-status.d.ts +5 -0
  127. package/dist/ui/components/mcp-status.js +57 -0
  128. package/dist/ui/components/mcp-status.js.map +1 -0
  129. package/dist/ui/components/model-selection.d.ts +12 -0
  130. package/dist/ui/components/model-selection.js +17 -0
  131. package/dist/ui/components/model-selection.js.map +1 -0
  132. package/dist/ui/components/mood-status.d.ts +7 -0
  133. package/dist/ui/components/mood-status.js +34 -0
  134. package/dist/ui/components/mood-status.js.map +1 -0
  135. package/dist/ui/components/persona-status.d.ts +7 -0
  136. package/dist/ui/components/persona-status.js +34 -0
  137. package/dist/ui/components/persona-status.js.map +1 -0
  138. package/dist/ui/shared/max-sized-box.d.ts +8 -0
  139. package/dist/ui/shared/max-sized-box.js +6 -0
  140. package/dist/ui/shared/max-sized-box.js.map +1 -0
  141. package/dist/ui/utils/code-colorizer.d.ts +2 -0
  142. package/dist/ui/utils/code-colorizer.js +7 -0
  143. package/dist/ui/utils/code-colorizer.js.map +1 -0
  144. package/dist/ui/utils/colors.d.ts +14 -0
  145. package/dist/ui/utils/colors.js +15 -0
  146. package/dist/ui/utils/colors.js.map +1 -0
  147. package/dist/ui/utils/markdown-renderer.d.ts +4 -0
  148. package/dist/ui/utils/markdown-renderer.js +40 -0
  149. package/dist/ui/utils/markdown-renderer.js.map +1 -0
  150. package/dist/utils/auth-helper.d.ts +63 -0
  151. package/dist/utils/auth-helper.js +129 -0
  152. package/dist/utils/auth-helper.js.map +1 -0
  153. package/dist/utils/chat-history-manager-sqlite.d.ts +92 -0
  154. package/dist/utils/chat-history-manager-sqlite.js +334 -0
  155. package/dist/utils/chat-history-manager-sqlite.js.map +1 -0
  156. package/dist/utils/chat-history-manager.d.ts +87 -0
  157. package/dist/utils/chat-history-manager.js +273 -0
  158. package/dist/utils/chat-history-manager.js.map +1 -0
  159. package/dist/utils/chat-history-manager.json-backup.d.ts +69 -0
  160. package/dist/utils/chat-history-manager.json-backup.js +215 -0
  161. package/dist/utils/chat-history-manager.json-backup.js.map +1 -0
  162. package/dist/utils/confirmation-service.d.ts +46 -0
  163. package/dist/utils/confirmation-service.js +165 -0
  164. package/dist/utils/confirmation-service.js.map +1 -0
  165. package/dist/utils/custom-instructions.d.ts +1 -0
  166. package/dist/utils/custom-instructions.js +30 -0
  167. package/dist/utils/custom-instructions.js.map +1 -0
  168. package/dist/utils/database-connection.d.ts +27 -0
  169. package/dist/utils/database-connection.js +81 -0
  170. package/dist/utils/database-connection.js.map +1 -0
  171. package/dist/utils/database-schema.d.ts +17 -0
  172. package/dist/utils/database-schema.js +93 -0
  173. package/dist/utils/database-schema.js.map +1 -0
  174. package/dist/utils/error-logger.d.ts +13 -0
  175. package/dist/utils/error-logger.js +56 -0
  176. package/dist/utils/error-logger.js.map +1 -0
  177. package/dist/utils/hook-executor.d.ts +59 -0
  178. package/dist/utils/hook-executor.js +351 -0
  179. package/dist/utils/hook-executor.js.map +1 -0
  180. package/dist/utils/model-config.d.ts +28 -0
  181. package/dist/utils/model-config.js +42 -0
  182. package/dist/utils/model-config.js.map +1 -0
  183. package/dist/utils/path-utils.d.ts +4 -0
  184. package/dist/utils/path-utils.js +12 -0
  185. package/dist/utils/path-utils.js.map +1 -0
  186. package/dist/utils/settings-manager.d.ts +169 -0
  187. package/dist/utils/settings-manager.js +403 -0
  188. package/dist/utils/settings-manager.js.map +1 -0
  189. package/dist/utils/settings.d.ts +1 -0
  190. package/dist/utils/settings.js +4 -0
  191. package/dist/utils/settings.js.map +1 -0
  192. package/dist/utils/slash-commands.d.ts +25 -0
  193. package/dist/utils/slash-commands.js +454 -0
  194. package/dist/utils/slash-commands.js.map +1 -0
  195. package/dist/utils/startup-hook.d.ts +13 -0
  196. package/dist/utils/startup-hook.js +44 -0
  197. package/dist/utils/startup-hook.js.map +1 -0
  198. package/dist/utils/text-utils.d.ts +80 -0
  199. package/dist/utils/text-utils.js +182 -0
  200. package/dist/utils/text-utils.js.map +1 -0
  201. package/dist/utils/token-counter.d.ts +33 -0
  202. package/dist/utils/token-counter.js +78 -0
  203. package/dist/utils/token-counter.js.map +1 -0
  204. package/package.json +102 -0
@@ -0,0 +1,24 @@
1
+ export class RestartTool {
2
+ /**
3
+ * Restart the application by exiting with code 51
4
+ */
5
+ async restart() {
6
+ try {
7
+ // Exit with code 51 to signal restart
8
+ process.exit(51);
9
+ // This line will never be reached, but TypeScript requires a return
10
+ return {
11
+ success: true,
12
+ output: "Restarting application..."
13
+ };
14
+ }
15
+ catch (error) {
16
+ return {
17
+ success: false,
18
+ error: error instanceof Error ? error.message : "Unknown error during restart",
19
+ output: error instanceof Error ? error.message : "Unknown error during restart"
20
+ };
21
+ }
22
+ }
23
+ }
24
+ //# sourceMappingURL=restart-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restart-tool.js","sourceRoot":"","sources":["../../src/tools/restart-tool.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,WAAW;IACtB;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEjB,oEAAoE;YACpE,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,2BAA2B;aACpC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B;gBAC9E,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B;aAChF,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,71 @@
1
+ import { ToolResult } from "../types/index.js";
2
+ import { ToolDiscovery } from "./tool-discovery.js";
3
+ export interface SearchResult {
4
+ file: string;
5
+ line: number;
6
+ column: number;
7
+ text: string;
8
+ match: string;
9
+ }
10
+ export interface FileSearchResult {
11
+ path: string;
12
+ name: string;
13
+ score: number;
14
+ }
15
+ export interface UnifiedSearchResult {
16
+ type: "text" | "file";
17
+ file: string;
18
+ line?: number;
19
+ column?: number;
20
+ text?: string;
21
+ match?: string;
22
+ score?: number;
23
+ }
24
+ export declare class SearchTool implements ToolDiscovery {
25
+ private confirmationService;
26
+ private currentDirectory;
27
+ /**
28
+ * Unified search method that can search for text content or find files
29
+ */
30
+ universalSearch(query: string, options?: {
31
+ searchType?: "text" | "files" | "both";
32
+ includePattern?: string;
33
+ excludePattern?: string;
34
+ caseSensitive?: boolean;
35
+ wholeWord?: boolean;
36
+ regex?: boolean;
37
+ maxResults?: number;
38
+ fileTypes?: string[];
39
+ excludeFiles?: string[];
40
+ includeHidden?: boolean;
41
+ }): Promise<ToolResult>;
42
+ /**
43
+ * Execute ripgrep command with specified options
44
+ */
45
+ private _executeRipgrep;
46
+ /**
47
+ * Parse ripgrep JSON output into SearchResult objects
48
+ */
49
+ private parseRipgrepOutput;
50
+ /**
51
+ * Find files by pattern using a simple file walking approach
52
+ */
53
+ private _findFilesByPattern;
54
+ /**
55
+ * Calculate fuzzy match score for file names
56
+ */
57
+ private calculateFileScore;
58
+ /**
59
+ * Format unified search results for display
60
+ */
61
+ private formatUnifiedResults;
62
+ /**
63
+ * Update current working directory
64
+ */
65
+ setCurrentDirectory(directory: string): void;
66
+ /**
67
+ * Get current working directory
68
+ */
69
+ getCurrentDirectory(): string;
70
+ getHandledToolNames(): string[];
71
+ }
@@ -0,0 +1,340 @@
1
+ import { spawn } from "child_process";
2
+ import { ConfirmationService } from "../utils/confirmation-service.js";
3
+ import fs from "fs-extra";
4
+ import * as path from "path";
5
+ import { getHandledToolNames } from "./tool-discovery.js";
6
+ export class SearchTool {
7
+ confirmationService = ConfirmationService.getInstance();
8
+ currentDirectory = process.cwd();
9
+ /**
10
+ * Unified search method that can search for text content or find files
11
+ */
12
+ async universalSearch(query, options = {}) {
13
+ try {
14
+ const searchType = options.searchType || "both";
15
+ const results = [];
16
+ // Search for text content if requested
17
+ if (searchType === "text" || searchType === "both") {
18
+ const textResults = await this._executeRipgrep(query, options);
19
+ results.push(...textResults.map((r) => ({
20
+ type: "text",
21
+ file: r.file,
22
+ line: r.line,
23
+ column: r.column,
24
+ text: r.text,
25
+ match: r.match,
26
+ })));
27
+ }
28
+ // Search for files if requested
29
+ if (searchType === "files" || searchType === "both") {
30
+ const fileResults = await this._findFilesByPattern(query, options);
31
+ results.push(...fileResults.map((r) => ({
32
+ type: "file",
33
+ file: r.path,
34
+ score: r.score,
35
+ })));
36
+ }
37
+ if (results.length === 0) {
38
+ return {
39
+ success: true,
40
+ output: `No results found for "${query}"`,
41
+ displayOutput: "",
42
+ };
43
+ }
44
+ const formattedOutput = this.formatUnifiedResults(results, query, searchType);
45
+ // Count unique files for displayOutput
46
+ const textResults = results.filter((r) => r.type === "text");
47
+ const fileResults = results.filter((r) => r.type === "file");
48
+ const allFiles = new Set();
49
+ textResults.forEach((r) => allFiles.add(r.file));
50
+ fileResults.forEach((r) => allFiles.add(r.file));
51
+ const fileCount = allFiles.size;
52
+ const matchCount = textResults.length;
53
+ let summary = `Found ${fileCount} ${fileCount === 1 ? 'file' : 'files'}`;
54
+ if (matchCount > 0) {
55
+ summary += ` (${matchCount} ${matchCount === 1 ? 'match' : 'matches'})`;
56
+ }
57
+ // Prepend summary to formattedOutput for display
58
+ const outputWithSummary = `${summary}\n\n${formattedOutput}`;
59
+ return {
60
+ success: true,
61
+ output: outputWithSummary,
62
+ displayOutput: "",
63
+ };
64
+ }
65
+ catch (error) {
66
+ return {
67
+ success: false,
68
+ error: `Search error: ${error.message}`,
69
+ };
70
+ }
71
+ }
72
+ /**
73
+ * Execute ripgrep command with specified options
74
+ */
75
+ async _executeRipgrep(query, options) {
76
+ return new Promise((resolve, reject) => {
77
+ const args = [
78
+ "--json",
79
+ "--with-filename",
80
+ "--line-number",
81
+ "--column",
82
+ "--no-heading",
83
+ "--color=never",
84
+ ];
85
+ // Add case sensitivity
86
+ if (!options.caseSensitive) {
87
+ args.push("--ignore-case");
88
+ }
89
+ // Add whole word matching
90
+ if (options.wholeWord) {
91
+ args.push("--word-regexp");
92
+ }
93
+ // Add regex mode
94
+ if (!options.regex) {
95
+ args.push("--fixed-strings");
96
+ }
97
+ // Add max results limit
98
+ if (options.maxResults) {
99
+ args.push("--max-count", options.maxResults.toString());
100
+ }
101
+ // Add file type filters
102
+ if (options.fileTypes) {
103
+ options.fileTypes.forEach((type) => {
104
+ args.push("--type", type);
105
+ });
106
+ }
107
+ // Add include pattern
108
+ if (options.includePattern) {
109
+ args.push("--glob", options.includePattern);
110
+ }
111
+ // Add exclude pattern
112
+ if (options.excludePattern) {
113
+ args.push("--glob", `!${options.excludePattern}`);
114
+ }
115
+ // Add exclude files
116
+ if (options.excludeFiles) {
117
+ options.excludeFiles.forEach((file) => {
118
+ args.push("--glob", `!${file}`);
119
+ });
120
+ }
121
+ // Respect gitignore and common ignore patterns
122
+ args.push("--no-require-git", "--follow", "--glob", "!.git/**", "--glob", "!node_modules/**", "--glob", "!.DS_Store", "--glob", "!*.log");
123
+ // Add query (search current directory)
124
+ args.push(query, ".");
125
+ const rg = spawn("rg", args, {
126
+ cwd: this.currentDirectory,
127
+ });
128
+ let output = "";
129
+ let errorOutput = "";
130
+ rg.stdout.on("data", (data) => {
131
+ output += data.toString();
132
+ });
133
+ rg.stderr.on("data", (data) => {
134
+ errorOutput += data.toString();
135
+ });
136
+ rg.on("close", (code) => {
137
+ if (code === 0 || code === 1) {
138
+ // 0 = found, 1 = not found
139
+ const results = this.parseRipgrepOutput(output);
140
+ resolve(results);
141
+ }
142
+ else if (code === 2) {
143
+ // Code 2 means an error occurred (e.g., file path issues)
144
+ // Return partial results if we have them, otherwise fail silently
145
+ const results = this.parseRipgrepOutput(output);
146
+ resolve(results);
147
+ }
148
+ else {
149
+ reject(new Error(`Ripgrep failed with code ${code}: ${errorOutput}`));
150
+ }
151
+ });
152
+ rg.on("error", (error) => {
153
+ reject(error);
154
+ });
155
+ });
156
+ }
157
+ /**
158
+ * Parse ripgrep JSON output into SearchResult objects
159
+ */
160
+ parseRipgrepOutput(output) {
161
+ const results = [];
162
+ const lines = output
163
+ .trim()
164
+ .split("\n")
165
+ .filter((line) => line.length > 0);
166
+ for (const line of lines) {
167
+ try {
168
+ const parsed = JSON.parse(line);
169
+ if (parsed.type === "match") {
170
+ const data = parsed.data;
171
+ results.push({
172
+ file: data.path.text,
173
+ line: data.line_number,
174
+ column: data.submatches[0]?.start || 0,
175
+ text: data.lines.text.trim(),
176
+ match: data.submatches[0]?.match?.text || "",
177
+ });
178
+ }
179
+ }
180
+ catch (e) {
181
+ // Skip invalid JSON lines
182
+ continue;
183
+ }
184
+ }
185
+ return results;
186
+ }
187
+ /**
188
+ * Find files by pattern using a simple file walking approach
189
+ */
190
+ async _findFilesByPattern(pattern, options) {
191
+ const files = [];
192
+ const maxResults = options.maxResults || 50;
193
+ const searchPattern = pattern.toLowerCase();
194
+ const walkDir = async (dir, depth = 0) => {
195
+ if (depth > 10 || files.length >= maxResults)
196
+ return; // Prevent infinite recursion and limit results
197
+ try {
198
+ const entries = await fs.readdir(dir, { withFileTypes: true });
199
+ for (const entry of entries) {
200
+ if (files.length >= maxResults)
201
+ break;
202
+ const fullPath = path.join(dir, entry.name);
203
+ const relativePath = path.relative(this.currentDirectory, fullPath);
204
+ // Skip hidden files unless explicitly included
205
+ if (!options.includeHidden && entry.name.startsWith(".")) {
206
+ continue;
207
+ }
208
+ // Skip common directories
209
+ if (entry.isDirectory() &&
210
+ [
211
+ "node_modules",
212
+ ".git",
213
+ ".svn",
214
+ ".hg",
215
+ "dist",
216
+ "build",
217
+ ".next",
218
+ ".cache",
219
+ ].includes(entry.name)) {
220
+ continue;
221
+ }
222
+ // Apply exclude pattern
223
+ if (options.excludePattern &&
224
+ relativePath.includes(options.excludePattern)) {
225
+ continue;
226
+ }
227
+ if (entry.isFile()) {
228
+ const score = this.calculateFileScore(entry.name, relativePath, searchPattern);
229
+ if (score > 0) {
230
+ files.push({
231
+ path: relativePath,
232
+ name: entry.name,
233
+ score,
234
+ });
235
+ }
236
+ }
237
+ else if (entry.isDirectory()) {
238
+ // Check if directory name matches pattern and add it to results
239
+ const score = this.calculateFileScore(entry.name, relativePath, searchPattern);
240
+ if (score > 0) {
241
+ files.push({
242
+ path: relativePath,
243
+ name: entry.name,
244
+ score,
245
+ });
246
+ }
247
+ // Recurse into directory
248
+ await walkDir(fullPath, depth + 1);
249
+ }
250
+ }
251
+ }
252
+ catch (error) {
253
+ // Skip directories we can't read
254
+ }
255
+ };
256
+ await walkDir(this.currentDirectory);
257
+ // Sort by score (descending) and return top results
258
+ return files.sort((a, b) => b.score - a.score).slice(0, maxResults);
259
+ }
260
+ /**
261
+ * Calculate fuzzy match score for file names
262
+ */
263
+ calculateFileScore(fileName, filePath, pattern) {
264
+ const lowerFileName = fileName.toLowerCase();
265
+ const lowerFilePath = filePath.toLowerCase();
266
+ // Exact matches get highest score
267
+ if (lowerFileName === pattern)
268
+ return 100;
269
+ if (lowerFileName.includes(pattern))
270
+ return 80;
271
+ // Path matches get medium score
272
+ if (lowerFilePath.includes(pattern))
273
+ return 60;
274
+ // Fuzzy matching - check if all characters of pattern exist in order
275
+ let patternIndex = 0;
276
+ for (let i = 0; i < lowerFileName.length && patternIndex < pattern.length; i++) {
277
+ if (lowerFileName[i] === pattern[patternIndex]) {
278
+ patternIndex++;
279
+ }
280
+ }
281
+ if (patternIndex === pattern.length) {
282
+ // All characters found in order - score based on how close they are
283
+ return Math.max(10, 40 - (fileName.length - pattern.length));
284
+ }
285
+ return 0;
286
+ }
287
+ /**
288
+ * Format unified search results for display
289
+ */
290
+ formatUnifiedResults(results, query, searchType) {
291
+ if (results.length === 0) {
292
+ return `No results found for "${query}"`;
293
+ }
294
+ let output = `Search results for "${query}":\n`;
295
+ // Separate text and file results
296
+ const textResults = results.filter((r) => r.type === "text");
297
+ const fileResults = results.filter((r) => r.type === "file");
298
+ // Show all unique files (from both text matches and file matches)
299
+ const allFiles = new Set();
300
+ // Add files from text results
301
+ textResults.forEach((result) => {
302
+ allFiles.add(result.file);
303
+ });
304
+ // Add files from file search results
305
+ fileResults.forEach((result) => {
306
+ allFiles.add(result.file);
307
+ });
308
+ const fileList = Array.from(allFiles);
309
+ const displayLimit = 8;
310
+ // Show files in compact format
311
+ fileList.slice(0, displayLimit).forEach((file) => {
312
+ // Count matches in this file for text results
313
+ const matchCount = textResults.filter((r) => r.file === file).length;
314
+ const matchIndicator = matchCount > 0 ? ` (${matchCount} matches)` : "";
315
+ output += ` ${file}${matchIndicator}\n`;
316
+ });
317
+ // Show "+X more" if there are additional results
318
+ if (fileList.length > displayLimit) {
319
+ const remaining = fileList.length - displayLimit;
320
+ output += ` ... +${remaining} more\n`;
321
+ }
322
+ return output.trim();
323
+ }
324
+ /**
325
+ * Update current working directory
326
+ */
327
+ setCurrentDirectory(directory) {
328
+ this.currentDirectory = directory;
329
+ }
330
+ /**
331
+ * Get current working directory
332
+ */
333
+ getCurrentDirectory() {
334
+ return this.currentDirectory;
335
+ }
336
+ getHandledToolNames() {
337
+ return getHandledToolNames(this);
338
+ }
339
+ }
340
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { ToolResult } from "../types/index.js";
2
+ import { ToolDiscovery } from "./tool-discovery.js";
3
+ export declare class TaskTool implements ToolDiscovery {
4
+ private agent;
5
+ setAgent(agent: any): void;
6
+ getHandledToolNames(): string[];
7
+ /**
8
+ * Start a new active task with action and optional color
9
+ */
10
+ startActiveTask(activeTask: string, action: string, color?: string): Promise<ToolResult>;
11
+ /**
12
+ * Transition the current active task to a new status/action
13
+ */
14
+ transitionActiveTaskStatus(action: string, color?: string): Promise<ToolResult>;
15
+ /**
16
+ * Stop the current active task with reason and documentation file
17
+ */
18
+ stopActiveTask(reason: string, documentationFile: string, color?: string): Promise<ToolResult>;
19
+ }
@@ -0,0 +1,115 @@
1
+ export class TaskTool {
2
+ agent; // Reference to the GrokAgent
3
+ setAgent(agent) {
4
+ this.agent = agent;
5
+ }
6
+ getHandledToolNames() {
7
+ return ["startActiveTask", "transitionActiveTaskStatus", "stopActiveTask"];
8
+ }
9
+ /**
10
+ * Start a new active task with action and optional color
11
+ */
12
+ async startActiveTask(activeTask, action, color) {
13
+ try {
14
+ if (!this.agent) {
15
+ return {
16
+ success: false,
17
+ error: "Agent not available",
18
+ output: "Agent not available"
19
+ };
20
+ }
21
+ // Start the active task
22
+ const result = await this.agent.startActiveTask(activeTask, action, color);
23
+ if (!result.success) {
24
+ return {
25
+ success: false,
26
+ error: result.error,
27
+ output: result.error || "Failed to start active task"
28
+ };
29
+ }
30
+ return {
31
+ success: true,
32
+ output: `Active task started: ${action}: ${activeTask}${color ? ` (color: ${color})` : ''}`,
33
+ displayOutput: `Active task started`
34
+ };
35
+ }
36
+ catch (error) {
37
+ return {
38
+ success: false,
39
+ error: error instanceof Error ? error.message : "Unknown error starting active task",
40
+ output: error instanceof Error ? error.message : "Unknown error starting active task"
41
+ };
42
+ }
43
+ }
44
+ /**
45
+ * Transition the current active task to a new status/action
46
+ */
47
+ async transitionActiveTaskStatus(action, color) {
48
+ try {
49
+ if (!this.agent) {
50
+ return {
51
+ success: false,
52
+ error: "Agent not available",
53
+ output: "Agent not available"
54
+ };
55
+ }
56
+ // Transition the active task status
57
+ const result = await this.agent.transitionActiveTaskStatus(action, color);
58
+ if (!result.success) {
59
+ return {
60
+ success: false,
61
+ error: result.error,
62
+ output: result.error || "Failed to transition active task status"
63
+ };
64
+ }
65
+ return {
66
+ success: true,
67
+ output: `Active task status transitioned to: ${action}${color ? ` (color: ${color})` : ''}`,
68
+ displayOutput: `Active task status updated`
69
+ };
70
+ }
71
+ catch (error) {
72
+ return {
73
+ success: false,
74
+ error: error instanceof Error ? error.message : "Unknown error transitioning active task status",
75
+ output: error instanceof Error ? error.message : "Unknown error transitioning active task status"
76
+ };
77
+ }
78
+ }
79
+ /**
80
+ * Stop the current active task with reason and documentation file
81
+ */
82
+ async stopActiveTask(reason, documentationFile, color) {
83
+ try {
84
+ if (!this.agent) {
85
+ return {
86
+ success: false,
87
+ error: "Agent not available",
88
+ output: "Agent not available"
89
+ };
90
+ }
91
+ // Stop the active task
92
+ const result = await this.agent.stopActiveTask(reason, documentationFile, color);
93
+ if (!result.success) {
94
+ return {
95
+ success: false,
96
+ error: result.error,
97
+ output: result.error || "Failed to stop active task"
98
+ };
99
+ }
100
+ return {
101
+ success: true,
102
+ output: `Active task stopped: ${reason}${color ? ` (color: ${color})` : ''}`,
103
+ displayOutput: `Active task stopped`
104
+ };
105
+ }
106
+ catch (error) {
107
+ return {
108
+ success: false,
109
+ error: error instanceof Error ? error.message : "Unknown error stopping active task",
110
+ output: error instanceof Error ? error.message : "Unknown error stopping active task"
111
+ };
112
+ }
113
+ }
114
+ }
115
+ //# sourceMappingURL=task-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-tool.js","sourceRoot":"","sources":["../../src/tools/task-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { ToolResult, EditorCommand } from "../types/index.js";
2
+ import { ToolDiscovery } from "./tool-discovery.js";
3
+ export declare class TextEditorTool implements ToolDiscovery {
4
+ private editHistory;
5
+ private confirmationService;
6
+ private agent;
7
+ setAgent(agent: any): void;
8
+ /**
9
+ * Get the maximum characters allowed based on current context usage
10
+ * Returns null if viewFile should be disabled
11
+ */
12
+ private getMaxCharsAllowed;
13
+ viewFile(filePath: string, viewRange?: [number, number]): Promise<ToolResult>;
14
+ strReplace(filePath: string, oldStr: string, newStr: string, replaceAll?: boolean): Promise<ToolResult>;
15
+ createNewFile(filePath: string, content: string): Promise<ToolResult>;
16
+ replaceLines(filePath: string, startLine: number, endLine: number, newContent: string): Promise<ToolResult>;
17
+ insertLines(filePath: string, insertLine: number, content: string): Promise<ToolResult>;
18
+ undoEdit(): Promise<ToolResult>;
19
+ private findFuzzyMatch;
20
+ private normalizeForComparison;
21
+ private isSimilarStructure;
22
+ /**
23
+ * Compute Longest Common Subsequence using dynamic programming
24
+ * Returns array of indices in oldLines that are part of LCS
25
+ */
26
+ private computeLCS;
27
+ /**
28
+ * Extract changes from LCS table
29
+ * Returns array of change regions
30
+ */
31
+ private extractChanges;
32
+ private generateDiff;
33
+ getEditHistory(): EditorCommand[];
34
+ getHandledToolNames(): string[];
35
+ }