kagent-ts 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 (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +395 -0
  3. package/dist/compression/interface.d.ts +26 -0
  4. package/dist/compression/interface.d.ts.map +1 -0
  5. package/dist/compression/interface.js +3 -0
  6. package/dist/compression/interface.js.map +1 -0
  7. package/dist/compression/sliding-window.d.ts +21 -0
  8. package/dist/compression/sliding-window.d.ts.map +1 -0
  9. package/dist/compression/sliding-window.js +55 -0
  10. package/dist/compression/sliding-window.js.map +1 -0
  11. package/dist/compression/types.d.ts +12 -0
  12. package/dist/compression/types.d.ts.map +1 -0
  13. package/dist/compression/types.js +3 -0
  14. package/dist/compression/types.js.map +1 -0
  15. package/dist/context/context-manager.d.ts +76 -0
  16. package/dist/context/context-manager.d.ts.map +1 -0
  17. package/dist/context/context-manager.js +132 -0
  18. package/dist/context/context-manager.js.map +1 -0
  19. package/dist/context/types.d.ts +35 -0
  20. package/dist/context/types.d.ts.map +1 -0
  21. package/dist/context/types.js +3 -0
  22. package/dist/context/types.js.map +1 -0
  23. package/dist/core/agent.d.ts +288 -0
  24. package/dist/core/agent.d.ts.map +1 -0
  25. package/dist/core/agent.js +398 -0
  26. package/dist/core/agent.js.map +1 -0
  27. package/dist/core/hooks.d.ts +34 -0
  28. package/dist/core/hooks.d.ts.map +1 -0
  29. package/dist/core/hooks.js +3 -0
  30. package/dist/core/hooks.js.map +1 -0
  31. package/dist/core/plan-solve-agent.d.ts +114 -0
  32. package/dist/core/plan-solve-agent.d.ts.map +1 -0
  33. package/dist/core/plan-solve-agent.js +450 -0
  34. package/dist/core/plan-solve-agent.js.map +1 -0
  35. package/dist/core/react-agent.d.ts +52 -0
  36. package/dist/core/react-agent.d.ts.map +1 -0
  37. package/dist/core/react-agent.js +266 -0
  38. package/dist/core/react-agent.js.map +1 -0
  39. package/dist/core/response-schema.d.ts +91 -0
  40. package/dist/core/response-schema.d.ts.map +1 -0
  41. package/dist/core/response-schema.js +292 -0
  42. package/dist/core/response-schema.js.map +1 -0
  43. package/dist/core/types.d.ts +6 -0
  44. package/dist/core/types.d.ts.map +1 -0
  45. package/dist/core/types.js +3 -0
  46. package/dist/core/types.js.map +1 -0
  47. package/dist/index.d.ts +39 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +67 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/llm/interface.d.ts +87 -0
  52. package/dist/llm/interface.d.ts.map +1 -0
  53. package/dist/llm/interface.js +3 -0
  54. package/dist/llm/interface.js.map +1 -0
  55. package/dist/llm/openai-provider.d.ts +92 -0
  56. package/dist/llm/openai-provider.d.ts.map +1 -0
  57. package/dist/llm/openai-provider.js +262 -0
  58. package/dist/llm/openai-provider.js.map +1 -0
  59. package/dist/messages/message.d.ts +50 -0
  60. package/dist/messages/message.d.ts.map +1 -0
  61. package/dist/messages/message.js +87 -0
  62. package/dist/messages/message.js.map +1 -0
  63. package/dist/messages/types.d.ts +31 -0
  64. package/dist/messages/types.d.ts.map +1 -0
  65. package/dist/messages/types.js +14 -0
  66. package/dist/messages/types.js.map +1 -0
  67. package/dist/preferences/preference-manager.d.ts +88 -0
  68. package/dist/preferences/preference-manager.d.ts.map +1 -0
  69. package/dist/preferences/preference-manager.js +196 -0
  70. package/dist/preferences/preference-manager.js.map +1 -0
  71. package/dist/preferences/types.d.ts +27 -0
  72. package/dist/preferences/types.d.ts.map +1 -0
  73. package/dist/preferences/types.js +3 -0
  74. package/dist/preferences/types.js.map +1 -0
  75. package/dist/session/session-manager.d.ts +56 -0
  76. package/dist/session/session-manager.d.ts.map +1 -0
  77. package/dist/session/session-manager.js +156 -0
  78. package/dist/session/session-manager.js.map +1 -0
  79. package/dist/session/session-types.d.ts +51 -0
  80. package/dist/session/session-types.d.ts.map +1 -0
  81. package/dist/session/session-types.js +3 -0
  82. package/dist/session/session-types.js.map +1 -0
  83. package/dist/skills/file-skill-loader.d.ts +88 -0
  84. package/dist/skills/file-skill-loader.d.ts.map +1 -0
  85. package/dist/skills/file-skill-loader.js +365 -0
  86. package/dist/skills/file-skill-loader.js.map +1 -0
  87. package/dist/skills/index.d.ts +4 -0
  88. package/dist/skills/index.d.ts.map +1 -0
  89. package/dist/skills/index.js +10 -0
  90. package/dist/skills/index.js.map +1 -0
  91. package/dist/skills/skill-manager.d.ts +133 -0
  92. package/dist/skills/skill-manager.d.ts.map +1 -0
  93. package/dist/skills/skill-manager.js +310 -0
  94. package/dist/skills/skill-manager.js.map +1 -0
  95. package/dist/skills/types.d.ts +42 -0
  96. package/dist/skills/types.d.ts.map +1 -0
  97. package/dist/skills/types.js +3 -0
  98. package/dist/skills/types.js.map +1 -0
  99. package/dist/tools/builtin/edit-file.d.ts +12 -0
  100. package/dist/tools/builtin/edit-file.d.ts.map +1 -0
  101. package/dist/tools/builtin/edit-file.js +123 -0
  102. package/dist/tools/builtin/edit-file.js.map +1 -0
  103. package/dist/tools/builtin/glob-search.d.ts +11 -0
  104. package/dist/tools/builtin/glob-search.d.ts.map +1 -0
  105. package/dist/tools/builtin/glob-search.js +264 -0
  106. package/dist/tools/builtin/glob-search.js.map +1 -0
  107. package/dist/tools/builtin/grep-search.d.ts +14 -0
  108. package/dist/tools/builtin/grep-search.d.ts.map +1 -0
  109. package/dist/tools/builtin/grep-search.js +264 -0
  110. package/dist/tools/builtin/grep-search.js.map +1 -0
  111. package/dist/tools/builtin/index.d.ts +21 -0
  112. package/dist/tools/builtin/index.d.ts.map +1 -0
  113. package/dist/tools/builtin/index.js +53 -0
  114. package/dist/tools/builtin/index.js.map +1 -0
  115. package/dist/tools/builtin/read-file.d.ts +11 -0
  116. package/dist/tools/builtin/read-file.d.ts.map +1 -0
  117. package/dist/tools/builtin/read-file.js +122 -0
  118. package/dist/tools/builtin/read-file.js.map +1 -0
  119. package/dist/tools/builtin/write-file.d.ts +10 -0
  120. package/dist/tools/builtin/write-file.d.ts.map +1 -0
  121. package/dist/tools/builtin/write-file.js +89 -0
  122. package/dist/tools/builtin/write-file.js.map +1 -0
  123. package/dist/tools/circuit-breaker.d.ts +77 -0
  124. package/dist/tools/circuit-breaker.d.ts.map +1 -0
  125. package/dist/tools/circuit-breaker.js +102 -0
  126. package/dist/tools/circuit-breaker.js.map +1 -0
  127. package/dist/tools/error-tracker.d.ts +116 -0
  128. package/dist/tools/error-tracker.d.ts.map +1 -0
  129. package/dist/tools/error-tracker.js +484 -0
  130. package/dist/tools/error-tracker.js.map +1 -0
  131. package/dist/tools/tool-registry.d.ts +87 -0
  132. package/dist/tools/tool-registry.d.ts.map +1 -0
  133. package/dist/tools/tool-registry.js +188 -0
  134. package/dist/tools/tool-registry.js.map +1 -0
  135. package/dist/tools/types.d.ts +95 -0
  136. package/dist/tools/types.d.ts.map +1 -0
  137. package/dist/tools/types.js +14 -0
  138. package/dist/tools/types.js.map +1 -0
  139. package/dist/utils/token-counter.d.ts +31 -0
  140. package/dist/utils/token-counter.d.ts.map +1 -0
  141. package/dist/utils/token-counter.js +105 -0
  142. package/dist/utils/token-counter.js.map +1 -0
  143. package/package.json +56 -0
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.EditFileTool = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ /**
40
+ * Edit a file by finding and replacing exact text.
41
+ *
42
+ * Parameters:
43
+ * - file_path (required): Absolute path to the file to edit.
44
+ * - old_string (required): The exact text to find (must match exactly).
45
+ * - new_string (required): The replacement text.
46
+ * - replace_all (optional): Replace all occurrences (default: false).
47
+ */
48
+ exports.EditFileTool = {
49
+ name: "edit_file",
50
+ description: "Edit a file by performing an exact string replacement. " +
51
+ "The old_string must match the file contents exactly, including whitespace and indentation. " +
52
+ "Useful for making targeted edits without rewriting the entire file.",
53
+ parameters: {
54
+ type: "object",
55
+ properties: {
56
+ file_path: {
57
+ type: "string",
58
+ description: "Absolute path to the file to edit.",
59
+ },
60
+ old_string: {
61
+ type: "string",
62
+ description: "The exact text to search for and replace. " +
63
+ "Must match the file contents exactly (including indentation).",
64
+ },
65
+ new_string: {
66
+ type: "string",
67
+ description: "The text to replace old_string with.",
68
+ },
69
+ replace_all: {
70
+ type: "boolean",
71
+ description: "If true, replace all occurrences of old_string. " +
72
+ "If false (default), only replace the first occurrence.",
73
+ },
74
+ },
75
+ required: ["file_path", "old_string", "new_string"],
76
+ },
77
+ async execute(args) {
78
+ const filePath = args.file_path;
79
+ const oldString = args.old_string;
80
+ const newString = args.new_string;
81
+ const replaceAll = args.replace_all === true;
82
+ if (!filePath || typeof filePath !== "string") {
83
+ return 'Error: "file_path" must be a non-empty string.';
84
+ }
85
+ if (!oldString || typeof oldString !== "string") {
86
+ return 'Error: "old_string" must be a non-empty string.';
87
+ }
88
+ if (newString === undefined || newString === null) {
89
+ return 'Error: "new_string" is required.';
90
+ }
91
+ const resolvedPath = path.resolve(filePath);
92
+ // Validate file exists
93
+ if (!fs.existsSync(resolvedPath)) {
94
+ return `Error: File not found: ${resolvedPath}`;
95
+ }
96
+ try {
97
+ const content = fs.readFileSync(resolvedPath, "utf-8");
98
+ // Check that old_string exists in the file
99
+ if (!content.includes(oldString)) {
100
+ return (`Error: The specified text was not found in the file.\n` +
101
+ `Make sure the text matches exactly, including whitespace and indentation.`);
102
+ }
103
+ // Perform the replacement
104
+ const newContent = replaceAll
105
+ ? content.split(oldString).join(newString)
106
+ : content.replace(oldString, newString);
107
+ // Write back
108
+ fs.writeFileSync(resolvedPath, newContent, "utf-8");
109
+ // Count occurrences replaced
110
+ const oldCount = content.split(oldString).length - 1;
111
+ const newLen = newContent.length;
112
+ const diff = newLen - content.length;
113
+ return (`Successfully applied edit to ${resolvedPath}\n` +
114
+ `Replaced ${replaceAll ? oldCount : 1} occurrence(s). ` +
115
+ `File size: ${diff > 0 ? "+" : ""}${diff} bytes (${content.length} → ${newLen}).`);
116
+ }
117
+ catch (err) {
118
+ const message = err instanceof Error ? err.message : String(err);
119
+ return `Error editing file "${resolvedPath}": ${message}`;
120
+ }
121
+ },
122
+ };
123
+ //# sourceMappingURL=edit-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-file.js","sourceRoot":"","sources":["../../../src/tools/builtin/edit-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Tool } from "../types";
2
+ /**
3
+ * Find files matching a glob pattern.
4
+ *
5
+ * Parameters:
6
+ * - pattern (required): Glob pattern (e.g. "**\/*.ts", "src/**\/*.json").
7
+ * - path (optional): Root directory to search in (default: current directory).
8
+ * - max_results (optional): Maximum number of results (default: 100).
9
+ */
10
+ export declare const GlobSearchTool: Tool;
11
+ //# sourceMappingURL=glob-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob-search.d.ts","sourceRoot":"","sources":["../../../src/tools/builtin/glob-search.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,EAAE,IA+F5B,CAAC"}
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.GlobSearchTool = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ /**
40
+ * Find files matching a glob pattern.
41
+ *
42
+ * Parameters:
43
+ * - pattern (required): Glob pattern (e.g. "**\/*.ts", "src/**\/*.json").
44
+ * - path (optional): Root directory to search in (default: current directory).
45
+ * - max_results (optional): Maximum number of results (default: 100).
46
+ */
47
+ exports.GlobSearchTool = {
48
+ name: "glob_search",
49
+ description: "Find files matching a glob pattern. Supports ** for recursive matching, " +
50
+ "* for wildcards, {a,b} for alternatives. Skips node_modules and hidden directories. " +
51
+ "Results are sorted by modification time (newest first).",
52
+ parameters: {
53
+ type: "object",
54
+ properties: {
55
+ pattern: {
56
+ type: "string",
57
+ description: "Glob pattern to match file paths against. " +
58
+ "Examples: '** / *.ts', 'src/** / *.json', '*.{ts,js}'.",
59
+ },
60
+ path: {
61
+ type: "string",
62
+ description: "Root directory to search in. Defaults to the current working directory.",
63
+ },
64
+ max_results: {
65
+ type: "number",
66
+ description: "Maximum number of results to return (default: 100).",
67
+ },
68
+ },
69
+ required: ["pattern"],
70
+ },
71
+ async execute(args) {
72
+ const rawPattern = args.pattern ?? "";
73
+ const searchPath = args.path || process.cwd();
74
+ const maxResults = args.max_results ?? 100;
75
+ if (!rawPattern || typeof rawPattern !== "string") {
76
+ return 'Error: "pattern" must be a non-empty string.';
77
+ }
78
+ const resolvedPath = path.resolve(searchPath);
79
+ if (!fs.existsSync(resolvedPath)) {
80
+ return `Error: Path not found: ${resolvedPath}`;
81
+ }
82
+ try {
83
+ const allFiles = listAllFiles(resolvedPath);
84
+ const matcher = buildGlobMatcher(rawPattern, resolvedPath);
85
+ const matched = allFiles.filter(matcher);
86
+ // Sort by modification time (newest first)
87
+ matched.sort((a, b) => {
88
+ try {
89
+ return fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs;
90
+ }
91
+ catch {
92
+ return 0;
93
+ }
94
+ });
95
+ const results = matched.slice(0, maxResults);
96
+ const cwd = process.cwd();
97
+ if (results.length === 0) {
98
+ return `No files found matching pattern "${rawPattern}" in ${resolvedPath}.`;
99
+ }
100
+ const formatted = results
101
+ .map((filePath) => {
102
+ const relative = path.relative(cwd, filePath);
103
+ try {
104
+ const stat = fs.statSync(filePath);
105
+ const size = stat.size;
106
+ const mtime = stat.mtime.toISOString().split("T")[0];
107
+ const sizeStr = size > 1024 * 1024
108
+ ? `${(size / 1024 / 1024).toFixed(1)} MB`
109
+ : size > 1024
110
+ ? `${(size / 1024).toFixed(1)} KB`
111
+ : `${size} B`;
112
+ return `${relative} (${sizeStr}, ${mtime})`;
113
+ }
114
+ catch {
115
+ return relative;
116
+ }
117
+ })
118
+ .join("\n");
119
+ const summary = results.length < matched.length
120
+ ? `Found ${matched.length} files, showing ${results.length} (newest first):`
121
+ : `Found ${results.length} files:`;
122
+ return `${summary}\n\n${formatted}`;
123
+ }
124
+ catch (err) {
125
+ const message = err instanceof Error ? err.message : String(err);
126
+ return `Error during glob search: ${message}`;
127
+ }
128
+ },
129
+ };
130
+ // ─── Helpers ─────────────────────────────────────────────────────────────
131
+ /**
132
+ * Recursively list all non-binary files under a root path.
133
+ */
134
+ function listAllFiles(rootPath) {
135
+ const results = [];
136
+ const SKIP_DIRS = new Set([
137
+ "node_modules",
138
+ ".git",
139
+ ".hg",
140
+ ".svn",
141
+ ".claude",
142
+ "__pycache__",
143
+ ".cache",
144
+ ]);
145
+ function walk(dir) {
146
+ try {
147
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
148
+ for (const entry of entries) {
149
+ const fullPath = path.join(dir, entry.name);
150
+ if (entry.isDirectory()) {
151
+ if (entry.name.startsWith(".") || SKIP_DIRS.has(entry.name))
152
+ continue;
153
+ walk(fullPath);
154
+ }
155
+ else if (entry.isFile()) {
156
+ results.push(fullPath);
157
+ }
158
+ }
159
+ }
160
+ catch {
161
+ // Permission denied, skip
162
+ }
163
+ }
164
+ try {
165
+ if (fs.statSync(rootPath).isFile()) {
166
+ return [rootPath];
167
+ }
168
+ }
169
+ catch {
170
+ return [];
171
+ }
172
+ walk(rootPath);
173
+ return results;
174
+ }
175
+ /**
176
+ * Build a glob matcher function.
177
+ * Supports: ** (recursive), * (single-segment wildcard), ? (single char),
178
+ * {a,b} (alternatives).
179
+ *
180
+ * Tries three matching strategies in order:
181
+ * 1. Match against the absolute path directly.
182
+ * 2. Match relative to the search root directory.
183
+ * 3. Match against just the file basename (for simple patterns like "*.ts").
184
+ */
185
+ function buildGlobMatcher(pattern, rootPath) {
186
+ // Normalize separators
187
+ const normalized = pattern.replace(/\\/g, "/");
188
+ const normalizedRoot = path
189
+ .resolve(rootPath)
190
+ .replace(/\\/g, "/")
191
+ .replace(/\/+$/, "");
192
+ // Build regex from glob
193
+ let regexStr = "^";
194
+ let i = 0;
195
+ while (i < normalized.length) {
196
+ const c = normalized[i];
197
+ if (c === "*" && normalized[i + 1] === "*" && normalized[i + 2] === "/") {
198
+ // **/ - matches zero or more directory levels
199
+ regexStr += "(.*/)?";
200
+ i += 3;
201
+ }
202
+ else if (c === "*" &&
203
+ normalized[i + 1] === "*" &&
204
+ i + 2 === normalized.length) {
205
+ // ** at end
206
+ regexStr += ".*";
207
+ i += 2;
208
+ }
209
+ else if (c === "*") {
210
+ regexStr += "[^/]*";
211
+ i += 1;
212
+ }
213
+ else if (c === "?") {
214
+ regexStr += "[^/]";
215
+ i += 1;
216
+ }
217
+ else if (c === ".") {
218
+ regexStr += "\\.";
219
+ i += 1;
220
+ }
221
+ else if (c === "{") {
222
+ const end = normalized.indexOf("}", i);
223
+ if (end > i) {
224
+ const items = normalized.substring(i + 1, end).split(",");
225
+ regexStr +=
226
+ "(" +
227
+ items
228
+ .map((item) => item.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"))
229
+ .join("|") +
230
+ ")";
231
+ i = end + 1;
232
+ }
233
+ else {
234
+ regexStr += "\\{";
235
+ i += 1;
236
+ }
237
+ }
238
+ else {
239
+ regexStr += c;
240
+ i += 1;
241
+ }
242
+ }
243
+ regexStr += "$";
244
+ const regex = new RegExp(regexStr);
245
+ return (filePath) => {
246
+ const normalizedPath = filePath.replace(/\\/g, "/");
247
+ // 1. Try matching the absolute path directly
248
+ if (regex.test(normalizedPath))
249
+ return true;
250
+ // 2. Try matching relative to the root search directory
251
+ if (normalizedPath.startsWith(normalizedRoot + "/") ||
252
+ normalizedPath === normalizedRoot) {
253
+ const relativePath = normalizedPath === normalizedRoot
254
+ ? "."
255
+ : normalizedPath.slice(normalizedRoot.length + 1);
256
+ if (regex.test(relativePath))
257
+ return true;
258
+ }
259
+ // 3. Try matching just the basename (for simple patterns like "*.ts")
260
+ const basename = normalizedPath.split("/").pop() ?? "";
261
+ return regex.test(basename);
262
+ };
263
+ }
264
+ //# sourceMappingURL=glob-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob-search.js","sourceRoot":"","sources":["../../../src/tools/builtin/glob-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Tool } from "../types";
2
+ /**
3
+ * Search file contents using regex or plain text patterns.
4
+ *
5
+ * Parameters:
6
+ * - pattern (required): Regex or plain text to search for.
7
+ * - path (optional): File or directory to search in (default: current directory).
8
+ * - glob (optional): File pattern filter (e.g. "*.ts", "*.{ts,js}").
9
+ * - case_sensitive (optional): Whether the search is case-sensitive (default: false).
10
+ *
11
+ * Uses a recursive file walk with Node.js built-in fs — no external dependencies.
12
+ */
13
+ export declare const GrepSearchTool: Tool;
14
+ //# sourceMappingURL=grep-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep-search.d.ts","sourceRoot":"","sources":["../../../src/tools/builtin/grep-search.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,cAAc,EAAE,IAoH5B,CAAC"}