micro-models-agent 0.2.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 (242) hide show
  1. package/README.md +311 -0
  2. package/dist/agent/context.d.ts +18 -0
  3. package/dist/agent/context.d.ts.map +1 -0
  4. package/dist/agent/context.js +155 -0
  5. package/dist/agent/context.js.map +1 -0
  6. package/dist/agent/loop.d.ts +15 -0
  7. package/dist/agent/loop.d.ts.map +1 -0
  8. package/dist/agent/loop.js +575 -0
  9. package/dist/agent/loop.js.map +1 -0
  10. package/dist/agent/memory.d.ts +23 -0
  11. package/dist/agent/memory.d.ts.map +1 -0
  12. package/dist/agent/memory.js +244 -0
  13. package/dist/agent/memory.js.map +1 -0
  14. package/dist/agent/system-prompt.d.ts +3 -0
  15. package/dist/agent/system-prompt.d.ts.map +1 -0
  16. package/dist/agent/system-prompt.js +185 -0
  17. package/dist/agent/system-prompt.js.map +1 -0
  18. package/dist/blog-api/types/index.d.ts +2 -0
  19. package/dist/blog-api/types/index.d.ts.map +1 -0
  20. package/dist/blog-api/types/index.js +2 -0
  21. package/dist/blog-api/types/index.js.map +1 -0
  22. package/dist/cli/config.d.ts +3 -0
  23. package/dist/cli/config.d.ts.map +1 -0
  24. package/dist/cli/config.js +25 -0
  25. package/dist/cli/config.js.map +1 -0
  26. package/dist/cli/model.d.ts +3 -0
  27. package/dist/cli/model.d.ts.map +1 -0
  28. package/dist/cli/model.js +144 -0
  29. package/dist/cli/model.js.map +1 -0
  30. package/dist/cli/provider.d.ts +3 -0
  31. package/dist/cli/provider.d.ts.map +1 -0
  32. package/dist/cli/provider.js +78 -0
  33. package/dist/cli/provider.js.map +1 -0
  34. package/dist/cli.d.ts +3 -0
  35. package/dist/cli.d.ts.map +1 -0
  36. package/dist/cli.js +88 -0
  37. package/dist/cli.js.map +1 -0
  38. package/dist/config/config.d.ts +5 -0
  39. package/dist/config/config.d.ts.map +1 -0
  40. package/dist/config/config.js +84 -0
  41. package/dist/config/config.js.map +1 -0
  42. package/dist/config/types.d.ts +38 -0
  43. package/dist/config/types.d.ts.map +1 -0
  44. package/dist/config/types.js +2 -0
  45. package/dist/config/types.js.map +1 -0
  46. package/dist/file-loader.d.ts +12 -0
  47. package/dist/file-loader.d.ts.map +1 -0
  48. package/dist/file-loader.js +115 -0
  49. package/dist/file-loader.js.map +1 -0
  50. package/dist/index.d.ts +3 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +5 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/indexer/cache.d.ts +27 -0
  55. package/dist/indexer/cache.d.ts.map +1 -0
  56. package/dist/indexer/cache.js +95 -0
  57. package/dist/indexer/cache.js.map +1 -0
  58. package/dist/indexer/code-index.d.ts +27 -0
  59. package/dist/indexer/code-index.d.ts.map +1 -0
  60. package/dist/indexer/code-index.js +197 -0
  61. package/dist/indexer/code-index.js.map +1 -0
  62. package/dist/indexer/project-map.d.ts +14 -0
  63. package/dist/indexer/project-map.d.ts.map +1 -0
  64. package/dist/indexer/project-map.js +157 -0
  65. package/dist/indexer/project-map.js.map +1 -0
  66. package/dist/llm/openai-compat.d.ts +11 -0
  67. package/dist/llm/openai-compat.d.ts.map +1 -0
  68. package/dist/llm/openai-compat.js +81 -0
  69. package/dist/llm/openai-compat.js.map +1 -0
  70. package/dist/llm/provider.d.ts +27 -0
  71. package/dist/llm/provider.d.ts.map +1 -0
  72. package/dist/llm/provider.js +2 -0
  73. package/dist/llm/provider.js.map +1 -0
  74. package/dist/llm/token-counter.d.ts +2 -0
  75. package/dist/llm/token-counter.d.ts.map +1 -0
  76. package/dist/llm/token-counter.js +24 -0
  77. package/dist/llm/token-counter.js.map +1 -0
  78. package/dist/repl/commands.d.ts +37 -0
  79. package/dist/repl/commands.d.ts.map +1 -0
  80. package/dist/repl/commands.js +433 -0
  81. package/dist/repl/commands.js.map +1 -0
  82. package/dist/repl/history.d.ts +19 -0
  83. package/dist/repl/history.d.ts.map +1 -0
  84. package/dist/repl/history.js +29 -0
  85. package/dist/repl/history.js.map +1 -0
  86. package/dist/repl/index.d.ts +5 -0
  87. package/dist/repl/index.d.ts.map +1 -0
  88. package/dist/repl/index.js +86 -0
  89. package/dist/repl/index.js.map +1 -0
  90. package/dist/repl.d.ts +5 -0
  91. package/dist/repl.d.ts.map +1 -0
  92. package/dist/repl.js +472 -0
  93. package/dist/repl.js.map +1 -0
  94. package/dist/session/store.d.ts +34 -0
  95. package/dist/session/store.d.ts.map +1 -0
  96. package/dist/session/store.js +115 -0
  97. package/dist/session/store.js.map +1 -0
  98. package/dist/skills/loader.d.ts +13 -0
  99. package/dist/skills/loader.d.ts.map +1 -0
  100. package/dist/skills/loader.js +122 -0
  101. package/dist/skills/loader.js.map +1 -0
  102. package/dist/styling/engine.d.ts +37 -0
  103. package/dist/styling/engine.d.ts.map +1 -0
  104. package/dist/styling/engine.js +136 -0
  105. package/dist/styling/engine.js.map +1 -0
  106. package/dist/styling/index.d.ts +7 -0
  107. package/dist/styling/index.d.ts.map +1 -0
  108. package/dist/styling/index.js +15 -0
  109. package/dist/styling/index.js.map +1 -0
  110. package/dist/styling/loader.d.ts +4 -0
  111. package/dist/styling/loader.d.ts.map +1 -0
  112. package/dist/styling/loader.js +78 -0
  113. package/dist/styling/loader.js.map +1 -0
  114. package/dist/styling/types.d.ts +46 -0
  115. package/dist/styling/types.d.ts.map +1 -0
  116. package/dist/styling/types.js +2 -0
  117. package/dist/styling/types.js.map +1 -0
  118. package/dist/tools/approve.d.ts +13 -0
  119. package/dist/tools/approve.d.ts.map +1 -0
  120. package/dist/tools/approve.js +32 -0
  121. package/dist/tools/approve.js.map +1 -0
  122. package/dist/tools/bash.d.ts +8 -0
  123. package/dist/tools/bash.d.ts.map +1 -0
  124. package/dist/tools/bash.js +186 -0
  125. package/dist/tools/bash.js.map +1 -0
  126. package/dist/tools/fs/copy-file.d.ts +5 -0
  127. package/dist/tools/fs/copy-file.d.ts.map +1 -0
  128. package/dist/tools/fs/copy-file.js +41 -0
  129. package/dist/tools/fs/copy-file.js.map +1 -0
  130. package/dist/tools/fs/create-dir.d.ts +5 -0
  131. package/dist/tools/fs/create-dir.d.ts.map +1 -0
  132. package/dist/tools/fs/create-dir.js +31 -0
  133. package/dist/tools/fs/create-dir.js.map +1 -0
  134. package/dist/tools/fs/delete-file.d.ts +5 -0
  135. package/dist/tools/fs/delete-file.d.ts.map +1 -0
  136. package/dist/tools/fs/delete-file.js +39 -0
  137. package/dist/tools/fs/delete-file.js.map +1 -0
  138. package/dist/tools/fs/edit-file.d.ts +5 -0
  139. package/dist/tools/fs/edit-file.d.ts.map +1 -0
  140. package/dist/tools/fs/edit-file.js +80 -0
  141. package/dist/tools/fs/edit-file.js.map +1 -0
  142. package/dist/tools/fs/file-info.d.ts +5 -0
  143. package/dist/tools/fs/file-info.d.ts.map +1 -0
  144. package/dist/tools/fs/file-info.js +37 -0
  145. package/dist/tools/fs/file-info.js.map +1 -0
  146. package/dist/tools/fs/glob-search.d.ts +5 -0
  147. package/dist/tools/fs/glob-search.d.ts.map +1 -0
  148. package/dist/tools/fs/glob-search.js +98 -0
  149. package/dist/tools/fs/glob-search.js.map +1 -0
  150. package/dist/tools/fs/grep-search.d.ts +5 -0
  151. package/dist/tools/fs/grep-search.d.ts.map +1 -0
  152. package/dist/tools/fs/grep-search.js +120 -0
  153. package/dist/tools/fs/grep-search.js.map +1 -0
  154. package/dist/tools/fs/list-dir.d.ts +5 -0
  155. package/dist/tools/fs/list-dir.d.ts.map +1 -0
  156. package/dist/tools/fs/list-dir.js +61 -0
  157. package/dist/tools/fs/list-dir.js.map +1 -0
  158. package/dist/tools/fs/move-file.d.ts +5 -0
  159. package/dist/tools/fs/move-file.d.ts.map +1 -0
  160. package/dist/tools/fs/move-file.js +41 -0
  161. package/dist/tools/fs/move-file.js.map +1 -0
  162. package/dist/tools/fs/path-utils.d.ts +30 -0
  163. package/dist/tools/fs/path-utils.d.ts.map +1 -0
  164. package/dist/tools/fs/path-utils.js +81 -0
  165. package/dist/tools/fs/path-utils.js.map +1 -0
  166. package/dist/tools/fs/read-file.d.ts +5 -0
  167. package/dist/tools/fs/read-file.d.ts.map +1 -0
  168. package/dist/tools/fs/read-file.js +51 -0
  169. package/dist/tools/fs/read-file.js.map +1 -0
  170. package/dist/tools/fs/tree.d.ts +5 -0
  171. package/dist/tools/fs/tree.d.ts.map +1 -0
  172. package/dist/tools/fs/tree.js +75 -0
  173. package/dist/tools/fs/tree.js.map +1 -0
  174. package/dist/tools/fs/types.d.ts +7 -0
  175. package/dist/tools/fs/types.d.ts.map +1 -0
  176. package/dist/tools/fs/types.js +9 -0
  177. package/dist/tools/fs/types.js.map +1 -0
  178. package/dist/tools/fs/write-file.d.ts +5 -0
  179. package/dist/tools/fs/write-file.d.ts.map +1 -0
  180. package/dist/tools/fs/write-file.js +58 -0
  181. package/dist/tools/fs/write-file.js.map +1 -0
  182. package/dist/tools/hooks.d.ts +15 -0
  183. package/dist/tools/hooks.d.ts.map +1 -0
  184. package/dist/tools/hooks.js +109 -0
  185. package/dist/tools/hooks.js.map +1 -0
  186. package/dist/tools/mcp.d.ts +22 -0
  187. package/dist/tools/mcp.d.ts.map +1 -0
  188. package/dist/tools/mcp.js +90 -0
  189. package/dist/tools/mcp.js.map +1 -0
  190. package/dist/tools/plan.d.ts +20 -0
  191. package/dist/tools/plan.d.ts.map +1 -0
  192. package/dist/tools/plan.js +86 -0
  193. package/dist/tools/plan.js.map +1 -0
  194. package/dist/tools/question.d.ts +17 -0
  195. package/dist/tools/question.d.ts.map +1 -0
  196. package/dist/tools/question.js +55 -0
  197. package/dist/tools/question.js.map +1 -0
  198. package/dist/tools/registry.d.ts +25 -0
  199. package/dist/tools/registry.d.ts.map +1 -0
  200. package/dist/tools/registry.js +81 -0
  201. package/dist/tools/registry.js.map +1 -0
  202. package/dist/tools/sanitizer.d.ts +7 -0
  203. package/dist/tools/sanitizer.d.ts.map +1 -0
  204. package/dist/tools/sanitizer.js +50 -0
  205. package/dist/tools/sanitizer.js.map +1 -0
  206. package/dist/tools/syntax-check.d.ts +16 -0
  207. package/dist/tools/syntax-check.d.ts.map +1 -0
  208. package/dist/tools/syntax-check.js +265 -0
  209. package/dist/tools/syntax-check.js.map +1 -0
  210. package/dist/tools/todo.d.ts +19 -0
  211. package/dist/tools/todo.d.ts.map +1 -0
  212. package/dist/tools/todo.js +102 -0
  213. package/dist/tools/todo.js.map +1 -0
  214. package/dist/ui/components/diff-view.d.ts +8 -0
  215. package/dist/ui/components/diff-view.d.ts.map +1 -0
  216. package/dist/ui/components/diff-view.js +25 -0
  217. package/dist/ui/components/diff-view.js.map +1 -0
  218. package/dist/ui/components/status-bar.d.ts +3 -0
  219. package/dist/ui/components/status-bar.d.ts.map +1 -0
  220. package/dist/ui/components/status-bar.js +14 -0
  221. package/dist/ui/components/status-bar.js.map +1 -0
  222. package/dist/ui/double-press.d.ts +9 -0
  223. package/dist/ui/double-press.d.ts.map +1 -0
  224. package/dist/ui/double-press.js +18 -0
  225. package/dist/ui/double-press.js.map +1 -0
  226. package/dist/ui/index.d.ts +4 -0
  227. package/dist/ui/index.d.ts.map +1 -0
  228. package/dist/ui/index.js +7 -0
  229. package/dist/ui/index.js.map +1 -0
  230. package/dist/ui/opentui-renderer.d.ts +53 -0
  231. package/dist/ui/opentui-renderer.d.ts.map +1 -0
  232. package/dist/ui/opentui-renderer.js +463 -0
  233. package/dist/ui/opentui-renderer.js.map +1 -0
  234. package/dist/ui/readline-renderer.d.ts +30 -0
  235. package/dist/ui/readline-renderer.d.ts.map +1 -0
  236. package/dist/ui/readline-renderer.js +97 -0
  237. package/dist/ui/readline-renderer.js.map +1 -0
  238. package/dist/ui/renderer.d.ts +35 -0
  239. package/dist/ui/renderer.d.ts.map +1 -0
  240. package/dist/ui/renderer.js +2 -0
  241. package/dist/ui/renderer.js.map +1 -0
  242. package/package.json +41 -0
@@ -0,0 +1,186 @@
1
+ import { execa, ExecaError } from 'execa';
2
+ import { writeFileSync, existsSync, mkdirSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ import { sanitize } from './sanitizer.js';
6
+ import { getTheme } from '../styling/index.js';
7
+ const MAX_OUTPUT_LENGTH = 8000;
8
+ const CACHE_DIR = join(homedir(), '.mma', 'cache');
9
+ const UNIX_TO_PWSH = [
10
+ [/^ls\s+-la/, 'dir'],
11
+ [/^ls\s+/, 'dir '],
12
+ [/^cat\s+/, 'Get-Content '],
13
+ [/^rm\s+/, 'Remove-Item -Force '],
14
+ [/^mv\s+/, 'Move-Item '],
15
+ [/^cp\s+/, 'Copy-Item '],
16
+ [/^mkdir\s+-p\s+(.+)/, (match) => {
17
+ // Handle multiple directories: mkdir -p dir1 dir2 dir3
18
+ const dirs = match[1].split(/\s+/).filter(Boolean);
19
+ return dirs.map(d => `New-Item -ItemType Directory -Force -Path "${d}"`).join('; ');
20
+ }],
21
+ [/^mkdir\s+/, 'New-Item -ItemType Directory -Path '],
22
+ [/^touch\s+/, 'New-Item -ItemType File -Force -Path '],
23
+ [/^grep\s+/, "Select-String -Pattern "],
24
+ [/^wc\s+/, 'Measure-Object -Line '],
25
+ [/^head\s+/, 'Get-Content -TotalCount '],
26
+ [/^tail\s+/, 'Get-Content -Tail '],
27
+ [/^echo\s+-e\s+/, 'Write-Output '],
28
+ [/^echo\s+/, 'Write-Output '],
29
+ [/^pwd\s*$/, 'Get-Location'],
30
+ [/^which\s+/, 'Get-Command '],
31
+ [/^find\s+/, 'Get-ChildItem -Recurse -Filter '],
32
+ [/^chmod\s+/, '# chmod not needed on Windows -- '],
33
+ ];
34
+ function expandBraces(cmd) {
35
+ // Expand bash-style brace expansion: dir\{a,b,c} -> dir\a; dir\b; dir\c
36
+ // Also handles: dir/{a,b,c} and dir\{a,b,c}
37
+ return cmd.replace(/\{([^{}]+)\}/g, (_, inner) => {
38
+ const items = inner.split(',').map((s) => s.trim());
39
+ // Return first item — the rest would need separate commands
40
+ // For New-Item, we'll return just the first path
41
+ return items[0] || '';
42
+ });
43
+ }
44
+ function translateToPowerShell(cmd) {
45
+ // Expand brace expansion first (bashism that doesn't work in PowerShell)
46
+ if (cmd.includes('{') && cmd.includes('}')) {
47
+ cmd = expandBraces(cmd);
48
+ }
49
+ for (const [pattern, replacement] of UNIX_TO_PWSH) {
50
+ if (pattern.test(cmd)) {
51
+ if (typeof replacement === 'function') {
52
+ const match = cmd.match(pattern);
53
+ if (match)
54
+ return replacement(match);
55
+ }
56
+ else {
57
+ return cmd.replace(pattern, replacement);
58
+ }
59
+ }
60
+ }
61
+ return cmd;
62
+ }
63
+ function ensureDirectoryExists(cmd, cwd) {
64
+ // Auto-create directory for Set-Content commands
65
+ const match = cmd.match(/Set-Content\s+-Path\s+['"]?([^'"]+?)['"]?\s+-Value/i);
66
+ if (match) {
67
+ let filePath = match[1];
68
+ // Fix common path issues: blog-api\src\file.ts -> blog-api/src/file.ts
69
+ filePath = filePath.replace(/\\/g, '/');
70
+ const dir = filePath.split('/').slice(0, -1).join('/');
71
+ if (dir) {
72
+ const fullDir = join(cwd, dir);
73
+ if (!existsSync(fullDir)) {
74
+ mkdirSync(fullDir, { recursive: true });
75
+ }
76
+ }
77
+ }
78
+ }
79
+ function fixJsonContent(cmd) {
80
+ // Fix backslashes in JSON content that break JSON parsing
81
+ // Problem: "dist\index.js" -> "dist\\index.js" or "dist/index.js"
82
+ return cmd.replace(/(-Value\s+['"])(.*?)(['"])/gs, (match, prefix, content, suffix) => {
83
+ // Replace \ with / in content (except for valid JSON escapes like \n, \t, \")
84
+ const fixed = content
85
+ .replace(/\\([^nrtbf"\\])/g, '/$1') // \i -> /i, but keep \n \t etc
86
+ .replace(/\\\\/g, '/'); // \\ -> /
87
+ return prefix + fixed + suffix;
88
+ });
89
+ }
90
+ function fixCommonPathIssues(cmd) {
91
+ // Fix: blog-api\src\file.ts -> blog-api/src/file.ts (normalize slashes)
92
+ // Fix: blog-apifile.ts -> blog-api/file.ts (missing slash)
93
+ let fixed = cmd;
94
+ // Fix missing slash between folder and file: "blog-api\package.json" -> "blog-api/package.json"
95
+ // But only if it looks like a path issue (no slash between folder name and file)
96
+ fixed = fixed.replace(/(['"])(\w+)-(\w+)\\(\w+\.\w+)/g, '$1$2-$3/$4');
97
+ return fixed;
98
+ }
99
+ function encodePowerShellCommand(cmd) {
100
+ const utf16le = Buffer.from(cmd, 'utf16le');
101
+ return utf16le.toString('base64');
102
+ }
103
+ function cleanCliXml(text) {
104
+ // Remove CLIXML wrapper and ANSI codes
105
+ if (!text.includes('#< CLIXML') && !text.includes('<Objs'))
106
+ return text;
107
+ // Extract error messages from CLIXML
108
+ const errors = [];
109
+ const regex = /<S S="Error">(.*?)<\/S>/gs;
110
+ let match;
111
+ while ((match = regex.exec(text)) !== null) {
112
+ // Remove ANSI codes and CLIXML entities
113
+ let msg = match[1]
114
+ .replace(/_x001B_\[[0-9;]*m/g, '') // ANSI codes
115
+ .replace(/&lt;/g, '<')
116
+ .replace(/&gt;/g, '>')
117
+ .replace(/&amp;/g, '&')
118
+ .replace(/&quot;/g, '"')
119
+ .trim();
120
+ if (msg && !errors.includes(msg)) {
121
+ errors.push(msg);
122
+ }
123
+ }
124
+ return errors.length > 0 ? errors.join('\n') : text;
125
+ }
126
+ export async function executeBash(cmd, timeoutSeconds = 120) {
127
+ // Block recursive calls to MMA itself
128
+ if (/\bmma\b/.test(cmd) && /\brun\b/.test(cmd)) {
129
+ return { stdout: '', stderr: 'Blocked: recursive MMA call detected. Use filesystem tools instead.', exitCode: 1, truncated: false };
130
+ }
131
+ cmd = fixCommonPathIssues(cmd);
132
+ cmd = fixJsonContent(cmd);
133
+ cmd = translateToPowerShell(cmd);
134
+ if (!sanitize(cmd).safe) {
135
+ const theme = getTheme();
136
+ return { stdout: '', stderr: theme.error(`Blocked by sanitizer`), exitCode: 1, truncated: false };
137
+ }
138
+ // Auto-create directory for file write commands
139
+ ensureDirectoryExists(cmd, process.cwd());
140
+ if (!existsSync(CACHE_DIR)) {
141
+ mkdirSync(CACHE_DIR, { recursive: true });
142
+ }
143
+ const cacheId = `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
144
+ const cacheFile = join(CACHE_DIR, `${cacheId}.out`);
145
+ let stdout = '';
146
+ let stderr = '';
147
+ let exitCode = 0;
148
+ const encoded = encodePowerShellCommand(cmd);
149
+ try {
150
+ const result = await execa('pwsh', ['-NoProfile', '-EncodedCommand', encoded], {
151
+ timeout: timeoutSeconds * 1000,
152
+ maxBuffer: 10 * 1024 * 1024,
153
+ windowsHide: true,
154
+ cwd: process.cwd(),
155
+ env: process.env,
156
+ encoding: 'utf8',
157
+ });
158
+ stdout = result.stdout;
159
+ stderr = result.stderr;
160
+ exitCode = result.exitCode ?? 0;
161
+ }
162
+ catch (e) {
163
+ if (e instanceof ExecaError) {
164
+ stdout = e.stdout ?? '';
165
+ stderr = e.stderr ?? '';
166
+ exitCode = e.exitCode ?? 1;
167
+ }
168
+ else {
169
+ stderr = String(e);
170
+ exitCode = 1;
171
+ }
172
+ }
173
+ // Clean CLIXML from stderr
174
+ stderr = cleanCliXml(stderr);
175
+ writeFileSync(cacheFile, stdout, 'utf-8');
176
+ let truncated = false;
177
+ if (stdout.length > MAX_OUTPUT_LENGTH) {
178
+ stdout = stdout.slice(0, MAX_OUTPUT_LENGTH) + `\n... (полный вывод сохранён в ${cacheFile})`;
179
+ truncated = true;
180
+ }
181
+ if (stderr.length > MAX_OUTPUT_LENGTH) {
182
+ stderr = stderr.slice(0, MAX_OUTPUT_LENGTH);
183
+ }
184
+ return { stdout, stderr, exitCode, truncated };
185
+ }
186
+ //# sourceMappingURL=bash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ToolDefinition } from '../registry.js';
2
+ import { fsOk } from './types.js';
3
+ export declare const copyFileDefinition: ToolDefinition;
4
+ export declare function handleCopyFile(args: Record<string, unknown>, cwd: string): ReturnType<typeof fsOk>;
5
+ //# sourceMappingURL=copy-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-file.d.ts","sourceRoot":"","sources":["../../../src/tools/fs/copy-file.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAW,IAAI,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,kBAAkB,EAAE,cAchC,CAAC;AAEF,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,MAAM,GACV,UAAU,CAAC,OAAO,IAAI,CAAC,CAqBzB"}
@@ -0,0 +1,41 @@
1
+ import { copyFileSync, mkdirSync } from 'node:fs';
2
+ import { dirname } from 'node:path';
3
+ import { resolvePath, assertExists, normalizePath } from './path-utils.js';
4
+ import { fsError, fsOk } from './types.js';
5
+ export const copyFileDefinition = {
6
+ type: 'function',
7
+ function: {
8
+ name: 'copy_file',
9
+ description: 'Copy a file to a new location.',
10
+ parameters: {
11
+ type: 'object',
12
+ properties: {
13
+ source: { type: 'string', description: 'Source file path' },
14
+ destination: { type: 'string', description: 'Destination file path' },
15
+ },
16
+ required: ['source', 'destination'],
17
+ },
18
+ },
19
+ };
20
+ export function handleCopyFile(args, cwd) {
21
+ const source = String(args.source ?? '');
22
+ const dest = String(args.destination ?? '');
23
+ const srcResolved = resolvePath(source, cwd);
24
+ if (!srcResolved.ok)
25
+ return fsError(`Source: ${srcResolved.error}`);
26
+ const srcExists = assertExists(srcResolved.abs, 'file');
27
+ if (!srcExists.ok)
28
+ return fsError(srcExists.error);
29
+ const dstResolved = resolvePath(dest, cwd);
30
+ if (!dstResolved.ok)
31
+ return fsError(`Destination: ${dstResolved.error}`);
32
+ try {
33
+ mkdirSync(dirname(dstResolved.abs), { recursive: true });
34
+ copyFileSync(srcResolved.abs, dstResolved.abs);
35
+ }
36
+ catch (e) {
37
+ return fsError(`Copy failed: ${e.message}`);
38
+ }
39
+ return fsOk(`Copied ${normalizePath(source)} → ${normalizePath(dest)}`);
40
+ }
41
+ //# sourceMappingURL=copy-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-file.js","sourceRoot":"","sources":["../../../src/tools/fs/copy-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,CAAC,MAAM,kBAAkB,GAAmB;IAChD,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,gCAAgC;QAC7C,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;gBAC3D,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE;aACtE;YACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC;SACpC;KACF;CACF,CAAC;AAEF,MAAM,UAAU,cAAc,CAC5B,IAA6B,EAC7B,GAAW;IAEX,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IAE5C,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,WAAW,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC,WAAW,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;IAEpE,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACxD,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAEnD,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,WAAW,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC,gBAAgB,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;IAEzE,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,YAAY,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,OAAO,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,IAAI,CAAC,UAAU,aAAa,CAAC,MAAM,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ToolDefinition } from '../registry.js';
2
+ import { fsOk } from './types.js';
3
+ export declare const createDirDefinition: ToolDefinition;
4
+ export declare function handleCreateDir(args: Record<string, unknown>, cwd: string): ReturnType<typeof fsOk>;
5
+ //# sourceMappingURL=create-dir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-dir.d.ts","sourceRoot":"","sources":["../../../src/tools/fs/create-dir.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAW,IAAI,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,mBAAmB,EAAE,cAajC,CAAC;AAEF,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,MAAM,GACV,UAAU,CAAC,OAAO,IAAI,CAAC,CAYzB"}
@@ -0,0 +1,31 @@
1
+ import { mkdirSync } from 'node:fs';
2
+ import { resolvePath, normalizePath } from './path-utils.js';
3
+ import { fsError, fsOk } from './types.js';
4
+ export const createDirDefinition = {
5
+ type: 'function',
6
+ function: {
7
+ name: 'create_dir',
8
+ description: 'Create a directory (and parent directories if needed).',
9
+ parameters: {
10
+ type: 'object',
11
+ properties: {
12
+ path: { type: 'string', description: 'Directory path to create' },
13
+ },
14
+ required: ['path'],
15
+ },
16
+ },
17
+ };
18
+ export function handleCreateDir(args, cwd) {
19
+ const path = String(args.path ?? '');
20
+ const resolved = resolvePath(path, cwd);
21
+ if (!resolved.ok)
22
+ return fsError(resolved.error);
23
+ try {
24
+ mkdirSync(resolved.abs, { recursive: true });
25
+ }
26
+ catch (e) {
27
+ return fsError(`Cannot create directory: ${e.message}`);
28
+ }
29
+ return fsOk(`Created directory: ${normalizePath(path)}`);
30
+ }
31
+ //# sourceMappingURL=create-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-dir.js","sourceRoot":"","sources":["../../../src/tools/fs/create-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,CAAC,MAAM,mBAAmB,GAAmB;IACjD,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,wDAAwD;QACrE,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0BAA0B,EAAE;aAClE;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;KACF;CACF,CAAC;AAEF,MAAM,UAAU,eAAe,CAC7B,IAA6B,EAC7B,GAAW;IAEX,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,OAAO,CAAC,4BAA4B,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,IAAI,CAAC,sBAAsB,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ToolDefinition } from '../registry.js';
2
+ import { fsOk } from './types.js';
3
+ export declare const deleteFileDefinition: ToolDefinition;
4
+ export declare function handleDeleteFile(args: Record<string, unknown>, cwd: string): ReturnType<typeof fsOk>;
5
+ //# sourceMappingURL=delete-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-file.d.ts","sourceRoot":"","sources":["../../../src/tools/fs/delete-file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAW,IAAI,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,oBAAoB,EAAE,cAclC,CAAC;AAEF,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,MAAM,GACV,UAAU,CAAC,OAAO,IAAI,CAAC,CAqBzB"}
@@ -0,0 +1,39 @@
1
+ import { rmSync } from 'node:fs';
2
+ import { resolvePath, assertExists, normalizePath } from './path-utils.js';
3
+ import { fsError, fsOk } from './types.js';
4
+ export const deleteFileDefinition = {
5
+ type: 'function',
6
+ function: {
7
+ name: 'delete_file',
8
+ description: 'Delete a file or directory. Directories require recursive: true.',
9
+ parameters: {
10
+ type: 'object',
11
+ properties: {
12
+ path: { type: 'string', description: 'Path to delete' },
13
+ recursive: { type: 'boolean', description: 'Delete directories recursively (default: false)' },
14
+ },
15
+ required: ['path'],
16
+ },
17
+ },
18
+ };
19
+ export function handleDeleteFile(args, cwd) {
20
+ const path = String(args.path ?? '');
21
+ const recursive = Boolean(args.recursive);
22
+ const resolved = resolvePath(path, cwd);
23
+ if (!resolved.ok)
24
+ return fsError(resolved.error);
25
+ const exists = assertExists(resolved.abs);
26
+ if (!exists.ok)
27
+ return fsError(exists.error);
28
+ if (exists.stat.isDirectory() && !recursive) {
29
+ return fsError(`Cannot delete directory without recursive: true. Use recursive: true for directories.`);
30
+ }
31
+ try {
32
+ rmSync(resolved.abs, { recursive, force: true });
33
+ }
34
+ catch (e) {
35
+ return fsError(`Delete failed: ${e.message}`);
36
+ }
37
+ return fsOk(`Deleted: ${normalizePath(path)}`);
38
+ }
39
+ //# sourceMappingURL=delete-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-file.js","sourceRoot":"","sources":["../../../src/tools/fs/delete-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,CAAC,MAAM,oBAAoB,GAAmB;IAClD,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,kEAAkE;QAC/E,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE;gBACvD,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,iDAAiD,EAAE;aAC/F;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;KACF;CACF,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAC9B,IAA6B,EAC7B,GAAW;IAEX,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE1C,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEjD,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE7C,IAAI,MAAM,CAAC,IAAK,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QAC7C,OAAO,OAAO,CAAC,uFAAuF,CAAC,CAAC;IAC1G,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,OAAO,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,IAAI,CAAC,YAAY,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ToolDefinition } from '../registry.js';
2
+ import { fsOk } from './types.js';
3
+ export declare const editFileDefinition: ToolDefinition;
4
+ export declare function handleEditFile(args: Record<string, unknown>, cwd: string): ReturnType<typeof fsOk>;
5
+ //# sourceMappingURL=edit-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-file.d.ts","sourceRoot":"","sources":["../../../src/tools/fs/edit-file.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAW,IAAI,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,kBAAkB,EAAE,cAgBhC,CAAC;AAEF,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,MAAM,GACV,UAAU,CAAC,OAAO,IAAI,CAAC,CA0CzB"}
@@ -0,0 +1,80 @@
1
+ import { readFileSync, writeFileSync, unlinkSync, renameSync, existsSync } from 'node:fs';
2
+ import { resolvePath, assertExists, normalizePath } from './path-utils.js';
3
+ import { fsError, fsOk } from './types.js';
4
+ export const editFileDefinition = {
5
+ type: 'function',
6
+ function: {
7
+ name: 'edit_file',
8
+ description: 'Find and replace text in a file. Use exact string matching (not regex). Fails if old_string not found or found multiple times (unless replace_all=true).',
9
+ parameters: {
10
+ type: 'object',
11
+ properties: {
12
+ path: { type: 'string', description: 'File path (relative to project root)' },
13
+ old_string: { type: 'string', description: 'Exact text to find (must match exactly)' },
14
+ new_string: { type: 'string', description: 'Replacement text' },
15
+ replace_all: { type: 'boolean', description: 'Replace all occurrences (default: false)' },
16
+ },
17
+ required: ['path', 'old_string', 'new_string'],
18
+ },
19
+ },
20
+ };
21
+ export function handleEditFile(args, cwd) {
22
+ const path = String(args.path ?? '');
23
+ const oldString = String(args.old_string ?? '');
24
+ const newString = String(args.new_string ?? '');
25
+ const replaceAll = Boolean(args.replace_all);
26
+ if (!path)
27
+ return fsError('path is required. Usage: {"name":"edit_file","arguments":{"path":"file.ts","old_string":"old","new_string":"new"}}');
28
+ if (!oldString)
29
+ return fsError('old_string is required');
30
+ if (newString === '' && !args.hasOwnProperty('new_string'))
31
+ return fsError('new_string is required (use empty string "" to delete text)');
32
+ const resolved = resolvePath(path, cwd);
33
+ if (!resolved.ok)
34
+ return fsError(resolved.error);
35
+ const exists = assertExists(resolved.abs, 'file');
36
+ if (!exists.ok)
37
+ return fsError(exists.error);
38
+ let content;
39
+ try {
40
+ content = readFileSync(resolved.abs, 'utf-8');
41
+ }
42
+ catch (e) {
43
+ return fsError(`Cannot read file: ${e.message}`);
44
+ }
45
+ if (!content.includes(oldString)) {
46
+ const preview = oldString.length > 80 ? oldString.slice(0, 80) + '...' : oldString;
47
+ return fsError(`old_string not found in file. Text: "${preview}"`);
48
+ }
49
+ if (replaceAll) {
50
+ const count = content.split(oldString).length - 1;
51
+ content = content.split(oldString).join(newString);
52
+ return writeAndReport(resolved.abs, content, path, count, 'Replaced');
53
+ }
54
+ const idx = content.indexOf(oldString);
55
+ const afterFirst = content.indexOf(oldString, idx + oldString.length);
56
+ if (afterFirst !== -1) {
57
+ return fsError(`old_string found multiple times. Use replace_all: true to replace all, or provide a more specific old_string.`);
58
+ }
59
+ content = content.slice(0, idx) + newString + content.slice(idx + oldString.length);
60
+ return writeAndReport(resolved.abs, content, path, 1, 'Replaced');
61
+ }
62
+ function writeAndReport(absPath, content, relPath, count, verb) {
63
+ const tmpPath = absPath + '.mma.tmp';
64
+ try {
65
+ writeFileSync(tmpPath, content, 'utf-8');
66
+ if (existsSync(absPath))
67
+ unlinkSync(absPath);
68
+ renameSync(tmpPath, absPath);
69
+ }
70
+ catch (e) {
71
+ try {
72
+ if (existsSync(tmpPath))
73
+ unlinkSync(tmpPath);
74
+ }
75
+ catch { /* ignore */ }
76
+ return fsError(`Write failed: ${e.message}`);
77
+ }
78
+ return fsOk(`${verb} ${count} occurrence(s) in ${normalizePath(relPath)}`);
79
+ }
80
+ //# sourceMappingURL=edit-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-file.js","sourceRoot":"","sources":["../../../src/tools/fs/edit-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ToolDefinition } from '../registry.js';
2
+ import { fsOk } from './types.js';
3
+ export declare const fileInfoDefinition: ToolDefinition;
4
+ export declare function handleFileInfo(args: Record<string, unknown>, cwd: string): ReturnType<typeof fsOk>;
5
+ //# sourceMappingURL=file-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-info.d.ts","sourceRoot":"","sources":["../../../src/tools/fs/file-info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAW,IAAI,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,kBAAkB,EAAE,cAahC,CAAC;AAEF,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,MAAM,GACV,UAAU,CAAC,OAAO,IAAI,CAAC,CAoBzB"}
@@ -0,0 +1,37 @@
1
+ import { resolvePath, assertExists, formatSize, normalizePath } from './path-utils.js';
2
+ import { fsError, fsOk } from './types.js';
3
+ export const fileInfoDefinition = {
4
+ type: 'function',
5
+ function: {
6
+ name: 'file_info',
7
+ description: 'Get file/directory metadata: size, dates, permissions.',
8
+ parameters: {
9
+ type: 'object',
10
+ properties: {
11
+ path: { type: 'string', description: 'File or directory path' },
12
+ },
13
+ required: ['path'],
14
+ },
15
+ },
16
+ };
17
+ export function handleFileInfo(args, cwd) {
18
+ const path = String(args.path ?? '');
19
+ const resolved = resolvePath(path, cwd);
20
+ if (!resolved.ok)
21
+ return fsError(resolved.error);
22
+ const exists = assertExists(resolved.abs);
23
+ if (!exists.ok)
24
+ return fsError(exists.error);
25
+ const s = exists.stat;
26
+ const info = [
27
+ `Path: ${normalizePath(path)}`,
28
+ `Type: ${s.isDirectory() ? 'directory' : 'file'}`,
29
+ `Size: ${formatSize(Number(s.size))}`,
30
+ `Created: ${s.birthtime.toISOString()}`,
31
+ `Modified: ${s.mtime.toISOString()}`,
32
+ `Accessed: ${s.atime.toISOString()}`,
33
+ `Mode: ${s.mode.toString(8)}`,
34
+ ];
35
+ return fsOk(info.join('\n'));
36
+ }
37
+ //# sourceMappingURL=file-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-info.js","sourceRoot":"","sources":["../../../src/tools/fs/file-info.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACvF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,CAAC,MAAM,kBAAkB,GAAmB;IAChD,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,wDAAwD;QACrE,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wBAAwB,EAAE;aAChE;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;KACF;CACF,CAAC;AAEF,MAAM,UAAU,cAAc,CAC5B,IAA6B,EAC7B,GAAW;IAEX,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEjD,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE7C,MAAM,CAAC,GAAG,MAAM,CAAC,IAAK,CAAC;IACvB,MAAM,IAAI,GAAG;QACX,SAAS,aAAa,CAAC,IAAI,CAAC,EAAE;QAC9B,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE;QACjD,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE;QACrC,aAAa,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE;QACxC,aAAa,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE;QACpC,aAAa,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE;QACpC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;KAC9B,CAAC;IAEF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ToolDefinition } from '../registry.js';
2
+ import { fsOk } from './types.js';
3
+ export declare const globSearchDefinition: ToolDefinition;
4
+ export declare function handleGlobSearch(args: Record<string, unknown>, cwd: string): ReturnType<typeof fsOk>;
5
+ //# sourceMappingURL=glob-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob-search.d.ts","sourceRoot":"","sources":["../../../src/tools/fs/glob-search.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAW,IAAI,EAAoB,MAAM,YAAY,CAAC;AAE7D,eAAO,MAAM,oBAAoB,EAAE,cAclC,CAAC;AAuDF,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,MAAM,GACV,UAAU,CAAC,OAAO,IAAI,CAAC,CAyBzB"}
@@ -0,0 +1,98 @@
1
+ import { join } from 'node:path';
2
+ import { resolvePath, IGNORE_DIRS, normalizePath, readDirEntries } from './path-utils.js';
3
+ import { fsError, fsOk } from './types.js';
4
+ export const globSearchDefinition = {
5
+ type: 'function',
6
+ function: {
7
+ name: 'glob_search',
8
+ description: 'Find files matching a glob pattern. Supports * and ** wildcards.',
9
+ parameters: {
10
+ type: 'object',
11
+ properties: {
12
+ pattern: { type: 'string', description: 'Glob pattern (e.g. "**/*.ts", "src/**/*.test.ts")' },
13
+ path: { type: 'string', description: 'Search root directory (default: project root)' },
14
+ },
15
+ required: ['pattern'],
16
+ },
17
+ },
18
+ };
19
+ function globToRegex(pattern) {
20
+ let re = '^';
21
+ let i = 0;
22
+ while (i < pattern.length) {
23
+ const c = pattern[i];
24
+ if (c === '*' && i + 2 < pattern.length && pattern[i + 1] === '*' && pattern[i + 2] === '/') {
25
+ re += '(.+/)?';
26
+ i += 3;
27
+ }
28
+ else if (c === '*' && i + 1 < pattern.length && pattern[i + 1] === '*') {
29
+ re += '.*';
30
+ i += 2;
31
+ }
32
+ else if (c === '*') {
33
+ re += '[^/]*';
34
+ i++;
35
+ }
36
+ else if (c === '?') {
37
+ re += '[^/]';
38
+ i++;
39
+ }
40
+ else if (c === '.') {
41
+ re += '\\.';
42
+ i++;
43
+ }
44
+ else if (/[+^${}()|[\]\\]/.test(c)) {
45
+ re += '\\' + c;
46
+ i++;
47
+ }
48
+ else {
49
+ re += c;
50
+ i++;
51
+ }
52
+ }
53
+ return new RegExp(re + '$');
54
+ }
55
+ function walkGlob(dir, baseDir, regex, results, maxResults) {
56
+ if (results.length >= maxResults)
57
+ return;
58
+ const entries = readDirEntries(dir);
59
+ for (const entry of entries) {
60
+ if (results.length >= maxResults)
61
+ break;
62
+ const name = String(entry.name);
63
+ if (IGNORE_DIRS.has(name) || name.startsWith('.'))
64
+ continue;
65
+ const fullPath = join(dir, name);
66
+ const rel = normalizePath(fullPath.slice(baseDir.length + 1));
67
+ if (entry.isDirectory()) {
68
+ walkGlob(fullPath, baseDir, regex, results, maxResults);
69
+ }
70
+ else if (entry.isFile()) {
71
+ if (regex.test(rel) || regex.test(name)) {
72
+ results.push(rel);
73
+ }
74
+ }
75
+ }
76
+ }
77
+ export function handleGlobSearch(args, cwd) {
78
+ const pattern = String(args.pattern ?? '');
79
+ const searchPath = String(args.path ?? '.');
80
+ if (!pattern)
81
+ return fsError('Pattern is required');
82
+ const resolved = resolvePath(searchPath, cwd);
83
+ if (!resolved.ok)
84
+ return fsError(resolved.error);
85
+ const regex = globToRegex(pattern);
86
+ const results = [];
87
+ const maxResults = 200;
88
+ walkGlob(resolved.abs, resolved.abs, regex, results, maxResults);
89
+ results.sort();
90
+ if (results.length === 0) {
91
+ return fsOk(`No files match pattern: ${pattern}`);
92
+ }
93
+ const truncated = results.length >= maxResults;
94
+ const output = results.join('\n');
95
+ const suffix = truncated ? `\n... (showing first ${maxResults} matches)` : '';
96
+ return fsOk(`${results.length} match(es) for "${pattern}":\n${output}${suffix}`, truncated);
97
+ }
98
+ //# sourceMappingURL=glob-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob-search.js","sourceRoot":"","sources":["../../../src/tools/fs/glob-search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAoB,MAAM,YAAY,CAAC;AAE7D,MAAM,CAAC,MAAM,oBAAoB,GAAmB;IAClD,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,kEAAkE;QAC/E,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mDAAmD,EAAE;gBAC7F,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+CAA+C,EAAE;aACvF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;CACF,CAAC;AAEF,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,EAAE,GAAG,GAAG,CAAC;IACb,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC5F,EAAE,IAAI,QAAQ,CAAC;YAAC,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACzE,EAAE,IAAI,IAAI,CAAC;YAAC,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;aAAM,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,EAAE,IAAI,OAAO,CAAC;YAAC,CAAC,EAAE,CAAC;QACrB,CAAC;aAAM,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,EAAE,IAAI,MAAM,CAAC;YAAC,CAAC,EAAE,CAAC;QACpB,CAAC;aAAM,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,EAAE,IAAI,KAAK,CAAC;YAAC,CAAC,EAAE,CAAC;QACnB,CAAC;aAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,EAAE,IAAI,IAAI,GAAG,CAAC,CAAC;YAAC,CAAC,EAAE,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,EAAE,IAAI,CAAC,CAAC;YAAC,CAAC,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,MAAM,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,QAAQ,CACf,GAAW,EACX,OAAe,EACf,KAAa,EACb,OAAiB,EACjB,UAAkB;IAElB,IAAI,OAAO,CAAC,MAAM,IAAI,UAAU;QAAE,OAAO;IAEzC,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAEpC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,IAAI,UAAU;YAAE,MAAM;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAE5D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAE9D,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAC1D,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,IAA6B,EAC7B,GAAW;IAEX,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;IAE5C,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAEpD,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC9C,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEjD,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,GAAG,CAAC;IAEvB,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACjE,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,wBAAwB,UAAU,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9E,OAAO,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,mBAAmB,OAAO,OAAO,MAAM,GAAG,MAAM,EAAE,EAAE,SAAS,CAAC,CAAC;AAC9F,CAAC"}