wave-agent-sdk 0.0.7 → 0.0.10
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.
- package/dist/agent.d.ts +105 -24
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +438 -53
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/managers/aiManager.d.ts +18 -7
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +254 -142
- package/dist/managers/backgroundBashManager.d.ts.map +1 -1
- package/dist/managers/backgroundBashManager.js +11 -9
- package/dist/managers/hookManager.d.ts +6 -6
- package/dist/managers/hookManager.d.ts.map +1 -1
- package/dist/managers/hookManager.js +81 -39
- package/dist/managers/liveConfigManager.d.ts +95 -0
- package/dist/managers/liveConfigManager.d.ts.map +1 -0
- package/dist/managers/liveConfigManager.js +442 -0
- package/dist/managers/lspManager.d.ts +43 -0
- package/dist/managers/lspManager.d.ts.map +1 -0
- package/dist/managers/lspManager.js +326 -0
- package/dist/managers/messageManager.d.ts +41 -24
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +184 -73
- package/dist/managers/permissionManager.d.ts +66 -0
- package/dist/managers/permissionManager.d.ts.map +1 -0
- package/dist/managers/permissionManager.js +208 -0
- package/dist/managers/skillManager.d.ts +1 -0
- package/dist/managers/skillManager.d.ts.map +1 -1
- package/dist/managers/skillManager.js +2 -1
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +4 -2
- package/dist/managers/subagentManager.d.ts +42 -6
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +213 -62
- package/dist/managers/toolManager.d.ts +38 -1
- package/dist/managers/toolManager.d.ts.map +1 -1
- package/dist/managers/toolManager.js +66 -2
- package/dist/services/aiService.d.ts +15 -5
- package/dist/services/aiService.d.ts.map +1 -1
- package/dist/services/aiService.js +446 -77
- package/dist/services/configurationService.d.ts +116 -0
- package/dist/services/configurationService.d.ts.map +1 -0
- package/dist/services/configurationService.js +585 -0
- package/dist/services/fileWatcher.d.ts +69 -0
- package/dist/services/fileWatcher.d.ts.map +1 -0
- package/dist/services/fileWatcher.js +212 -0
- package/dist/services/hook.d.ts +5 -40
- package/dist/services/hook.d.ts.map +1 -1
- package/dist/services/hook.js +47 -109
- package/dist/services/jsonlHandler.d.ts +71 -0
- package/dist/services/jsonlHandler.d.ts.map +1 -0
- package/dist/services/jsonlHandler.js +236 -0
- package/dist/services/memory.d.ts.map +1 -1
- package/dist/services/memory.js +33 -11
- package/dist/services/session.d.ts +116 -52
- package/dist/services/session.d.ts.map +1 -1
- package/dist/services/session.js +415 -143
- package/dist/tools/bashTool.d.ts.map +1 -1
- package/dist/tools/bashTool.js +77 -17
- package/dist/tools/deleteFileTool.d.ts.map +1 -1
- package/dist/tools/deleteFileTool.js +27 -1
- package/dist/tools/editTool.d.ts.map +1 -1
- package/dist/tools/editTool.js +33 -8
- package/dist/tools/lspTool.d.ts +6 -0
- package/dist/tools/lspTool.d.ts.map +1 -0
- package/dist/tools/lspTool.js +589 -0
- package/dist/tools/multiEditTool.d.ts.map +1 -1
- package/dist/tools/multiEditTool.js +30 -10
- package/dist/tools/readTool.d.ts.map +1 -1
- package/dist/tools/readTool.js +113 -3
- package/dist/tools/skillTool.js +2 -2
- package/dist/tools/todoWriteTool.d.ts.map +1 -1
- package/dist/tools/todoWriteTool.js +23 -0
- package/dist/tools/types.d.ts +11 -8
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/writeTool.d.ts.map +1 -1
- package/dist/tools/writeTool.js +30 -15
- package/dist/types/commands.d.ts +4 -1
- package/dist/types/commands.d.ts.map +1 -1
- package/dist/types/config.d.ts +4 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/configuration.d.ts +69 -0
- package/dist/types/configuration.d.ts.map +1 -0
- package/dist/types/configuration.js +8 -0
- package/dist/types/core.d.ts +45 -0
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/environment.d.ts +83 -0
- package/dist/types/environment.d.ts.map +1 -0
- package/dist/types/environment.js +21 -0
- package/dist/types/fileSearch.d.ts +5 -0
- package/dist/types/fileSearch.d.ts.map +1 -0
- package/dist/types/fileSearch.js +1 -0
- package/dist/types/hooks.d.ts +18 -3
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/hooks.js +8 -8
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +7 -0
- package/dist/types/lsp.d.ts +90 -0
- package/dist/types/lsp.d.ts.map +1 -0
- package/dist/types/lsp.js +4 -0
- package/dist/types/messaging.d.ts +19 -12
- package/dist/types/messaging.d.ts.map +1 -1
- package/dist/types/permissions.d.ts +35 -0
- package/dist/types/permissions.d.ts.map +1 -0
- package/dist/types/permissions.js +12 -0
- package/dist/types/session.d.ts +15 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +7 -0
- package/dist/types/skills.d.ts +1 -0
- package/dist/types/skills.d.ts.map +1 -1
- package/dist/types/tools.d.ts +35 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +4 -0
- package/dist/utils/abortUtils.d.ts +34 -0
- package/dist/utils/abortUtils.d.ts.map +1 -0
- package/dist/utils/abortUtils.js +92 -0
- package/dist/utils/bashHistory.d.ts +4 -0
- package/dist/utils/bashHistory.d.ts.map +1 -1
- package/dist/utils/bashHistory.js +48 -30
- package/dist/utils/builtinSubagents.d.ts +7 -0
- package/dist/utils/builtinSubagents.d.ts.map +1 -0
- package/dist/utils/builtinSubagents.js +65 -0
- package/dist/utils/cacheControlUtils.d.ts +96 -0
- package/dist/utils/cacheControlUtils.d.ts.map +1 -0
- package/dist/utils/cacheControlUtils.js +324 -0
- package/dist/utils/commandPathResolver.d.ts +52 -0
- package/dist/utils/commandPathResolver.d.ts.map +1 -0
- package/dist/utils/commandPathResolver.js +145 -0
- package/dist/utils/configPaths.d.ts +85 -0
- package/dist/utils/configPaths.d.ts.map +1 -0
- package/dist/utils/configPaths.js +121 -0
- package/dist/utils/constants.d.ts +1 -13
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +2 -14
- package/dist/utils/convertMessagesForAPI.d.ts +2 -1
- package/dist/utils/convertMessagesForAPI.d.ts.map +1 -1
- package/dist/utils/convertMessagesForAPI.js +39 -18
- package/dist/utils/customCommands.d.ts.map +1 -1
- package/dist/utils/customCommands.js +66 -21
- package/dist/utils/fileSearch.d.ts +14 -0
- package/dist/utils/fileSearch.d.ts.map +1 -0
- package/dist/utils/fileSearch.js +88 -0
- package/dist/utils/fileUtils.d.ts +27 -0
- package/dist/utils/fileUtils.d.ts.map +1 -0
- package/dist/utils/fileUtils.js +145 -0
- package/dist/utils/globalLogger.d.ts +88 -0
- package/dist/utils/globalLogger.d.ts.map +1 -0
- package/dist/utils/globalLogger.js +120 -0
- package/dist/utils/largeOutputHandler.d.ts +15 -0
- package/dist/utils/largeOutputHandler.d.ts.map +1 -0
- package/dist/utils/largeOutputHandler.js +40 -0
- package/dist/utils/markdownParser.d.ts.map +1 -1
- package/dist/utils/markdownParser.js +1 -17
- package/dist/utils/mcpUtils.d.ts.map +1 -1
- package/dist/utils/mcpUtils.js +25 -3
- package/dist/utils/messageOperations.d.ts +20 -18
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/messageOperations.js +30 -38
- package/dist/utils/pathEncoder.d.ts +108 -0
- package/dist/utils/pathEncoder.d.ts.map +1 -0
- package/dist/utils/pathEncoder.js +279 -0
- package/dist/utils/subagentParser.d.ts +2 -2
- package/dist/utils/subagentParser.d.ts.map +1 -1
- package/dist/utils/subagentParser.js +12 -8
- package/dist/utils/tokenCalculation.d.ts +26 -0
- package/dist/utils/tokenCalculation.d.ts.map +1 -0
- package/dist/utils/tokenCalculation.js +36 -0
- package/dist/utils/tokenEstimator.d.ts +39 -0
- package/dist/utils/tokenEstimator.d.ts.map +1 -0
- package/dist/utils/tokenEstimator.js +55 -0
- package/package.json +6 -6
- package/src/agent.ts +586 -78
- package/src/index.ts +4 -0
- package/src/managers/aiManager.ts +341 -192
- package/src/managers/backgroundBashManager.ts +11 -9
- package/src/managers/hookManager.ts +102 -54
- package/src/managers/liveConfigManager.ts +634 -0
- package/src/managers/lspManager.ts +434 -0
- package/src/managers/messageManager.ts +258 -121
- package/src/managers/permissionManager.ts +276 -0
- package/src/managers/skillManager.ts +3 -1
- package/src/managers/slashCommandManager.ts +5 -3
- package/src/managers/subagentManager.ts +295 -76
- package/src/managers/toolManager.ts +95 -3
- package/src/services/aiService.ts +656 -84
- package/src/services/configurationService.ts +762 -0
- package/src/services/fileWatcher.ts +300 -0
- package/src/services/hook.ts +54 -144
- package/src/services/jsonlHandler.ts +303 -0
- package/src/services/memory.ts +34 -11
- package/src/services/session.ts +522 -173
- package/src/tools/bashTool.ts +94 -20
- package/src/tools/deleteFileTool.ts +38 -1
- package/src/tools/editTool.ts +44 -9
- package/src/tools/lspTool.ts +760 -0
- package/src/tools/multiEditTool.ts +41 -11
- package/src/tools/readTool.ts +127 -3
- package/src/tools/skillTool.ts +2 -2
- package/src/tools/todoWriteTool.ts +33 -1
- package/src/tools/types.ts +15 -9
- package/src/tools/writeTool.ts +43 -16
- package/src/types/commands.ts +6 -1
- package/src/types/config.ts +5 -0
- package/src/types/configuration.ts +73 -0
- package/src/types/core.ts +55 -0
- package/src/types/environment.ts +104 -0
- package/src/types/fileSearch.ts +4 -0
- package/src/types/hooks.ts +32 -16
- package/src/types/index.ts +7 -0
- package/src/types/lsp.ts +96 -0
- package/src/types/messaging.ts +21 -14
- package/src/types/permissions.ts +48 -0
- package/src/types/session.ts +20 -0
- package/src/types/skills.ts +1 -0
- package/src/types/tools.ts +38 -0
- package/src/utils/abortUtils.ts +118 -0
- package/src/utils/bashHistory.ts +55 -31
- package/src/utils/builtinSubagents.ts +71 -0
- package/src/utils/cacheControlUtils.ts +475 -0
- package/src/utils/commandPathResolver.ts +189 -0
- package/src/utils/configPaths.ts +163 -0
- package/src/utils/constants.ts +2 -17
- package/src/utils/convertMessagesForAPI.ts +44 -18
- package/src/utils/customCommands.ts +90 -22
- package/src/utils/fileSearch.ts +107 -0
- package/src/utils/fileUtils.ts +160 -0
- package/src/utils/globalLogger.ts +128 -0
- package/src/utils/largeOutputHandler.ts +55 -0
- package/src/utils/markdownParser.ts +1 -19
- package/src/utils/mcpUtils.ts +34 -3
- package/src/utils/messageOperations.ts +47 -53
- package/src/utils/pathEncoder.ts +394 -0
- package/src/utils/subagentParser.ts +13 -9
- package/src/utils/tokenCalculation.ts +43 -0
- package/src/utils/tokenEstimator.ts +68 -0
- package/dist/utils/configResolver.d.ts +0 -38
- package/dist/utils/configResolver.d.ts.map +0 -1
- package/dist/utils/configResolver.js +0 -106
- package/src/utils/configResolver.ts +0 -142
package/src/tools/bashTool.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { spawn, ChildProcess } from "child_process";
|
|
2
|
+
import { logger } from "../utils/globalLogger.js";
|
|
3
|
+
import { stripAnsiColors } from "../utils/stringUtils.js";
|
|
4
|
+
import { handleLargeOutput } from "../utils/largeOutputHandler.js";
|
|
2
5
|
import type { ToolPlugin, ToolResult, ToolContext } from "./types.js";
|
|
3
6
|
|
|
4
7
|
/**
|
|
@@ -44,6 +47,7 @@ export const bashTool: ToolPlugin = {
|
|
|
44
47
|
): Promise<ToolResult> => {
|
|
45
48
|
const command = args.command as string;
|
|
46
49
|
const runInBackground = args.run_in_background as boolean | undefined;
|
|
50
|
+
const description = args.description as string | undefined;
|
|
47
51
|
// Set default timeout: 60s for foreground, no timeout for background
|
|
48
52
|
const timeout =
|
|
49
53
|
(args.timeout as number | undefined) ??
|
|
@@ -69,6 +73,45 @@ export const bashTool: ToolPlugin = {
|
|
|
69
73
|
};
|
|
70
74
|
}
|
|
71
75
|
|
|
76
|
+
// Permission check after validation but before real operation
|
|
77
|
+
if (
|
|
78
|
+
context.permissionManager &&
|
|
79
|
+
context.permissionMode &&
|
|
80
|
+
context.permissionMode !== "bypassPermissions"
|
|
81
|
+
) {
|
|
82
|
+
if (context.permissionManager.isRestrictedTool("Bash")) {
|
|
83
|
+
try {
|
|
84
|
+
const permissionContext = context.permissionManager.createContext(
|
|
85
|
+
"Bash",
|
|
86
|
+
context.permissionMode,
|
|
87
|
+
context.canUseToolCallback,
|
|
88
|
+
{
|
|
89
|
+
command,
|
|
90
|
+
description,
|
|
91
|
+
run_in_background: runInBackground,
|
|
92
|
+
timeout,
|
|
93
|
+
},
|
|
94
|
+
);
|
|
95
|
+
const permissionResult =
|
|
96
|
+
await context.permissionManager.checkPermission(permissionContext);
|
|
97
|
+
|
|
98
|
+
if (permissionResult.behavior === "deny") {
|
|
99
|
+
return {
|
|
100
|
+
success: false,
|
|
101
|
+
content: "",
|
|
102
|
+
error: `Bash operation denied by user, reason: ${permissionResult.message || "No reason provided"}`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
} catch {
|
|
106
|
+
return {
|
|
107
|
+
success: false,
|
|
108
|
+
content: "",
|
|
109
|
+
error: "Permission check failed",
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
72
115
|
if (runInBackground) {
|
|
73
116
|
// Background execution
|
|
74
117
|
const backgroundBashManager = context?.backgroundBashManager;
|
|
@@ -133,8 +176,8 @@ export const bashTool: ToolPlugin = {
|
|
|
133
176
|
if (child.pid && !child.killed) {
|
|
134
177
|
try {
|
|
135
178
|
process.kill(-child.pid, "SIGKILL");
|
|
136
|
-
} catch {
|
|
137
|
-
|
|
179
|
+
} catch (killError) {
|
|
180
|
+
logger.error("Failed to force kill process:", killError);
|
|
138
181
|
}
|
|
139
182
|
}
|
|
140
183
|
}, 1000);
|
|
@@ -147,8 +190,8 @@ export const bashTool: ToolPlugin = {
|
|
|
147
190
|
child.kill("SIGKILL");
|
|
148
191
|
}
|
|
149
192
|
}, 1000);
|
|
150
|
-
} catch {
|
|
151
|
-
|
|
193
|
+
} catch (directKillError) {
|
|
194
|
+
logger.error("Failed to kill child process:", directKillError);
|
|
152
195
|
}
|
|
153
196
|
}
|
|
154
197
|
}
|
|
@@ -167,18 +210,21 @@ export const bashTool: ToolPlugin = {
|
|
|
167
210
|
handleAbort();
|
|
168
211
|
return;
|
|
169
212
|
}
|
|
170
|
-
|
|
213
|
+
// Use { once: true } to prevent listener accumulation on signal reuse
|
|
214
|
+
context.abortSignal.addEventListener("abort", () => handleAbort(), {
|
|
215
|
+
once: true,
|
|
216
|
+
});
|
|
171
217
|
}
|
|
172
218
|
|
|
173
219
|
child.stdout?.on("data", (data) => {
|
|
174
220
|
if (!isAborted) {
|
|
175
|
-
outputBuffer += data.toString();
|
|
221
|
+
outputBuffer += stripAnsiColors(data.toString());
|
|
176
222
|
}
|
|
177
223
|
});
|
|
178
224
|
|
|
179
225
|
child.stderr?.on("data", (data) => {
|
|
180
226
|
if (!isAborted) {
|
|
181
|
-
errorBuffer += data.toString();
|
|
227
|
+
errorBuffer += stripAnsiColors(data.toString());
|
|
182
228
|
}
|
|
183
229
|
});
|
|
184
230
|
|
|
@@ -192,15 +238,32 @@ export const bashTool: ToolPlugin = {
|
|
|
192
238
|
const combinedOutput =
|
|
193
239
|
outputBuffer + (errorBuffer ? "\n" + errorBuffer : "");
|
|
194
240
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
241
|
+
// Handle large output by writing to temp file if needed
|
|
242
|
+
const finalOutput =
|
|
243
|
+
combinedOutput || `Command executed with exit code: ${exitCode}`;
|
|
244
|
+
handleLargeOutput(finalOutput)
|
|
245
|
+
.then(({ content, filePath }) => {
|
|
246
|
+
resolve({
|
|
247
|
+
success: exitCode === 0,
|
|
248
|
+
content,
|
|
249
|
+
filePath,
|
|
250
|
+
error:
|
|
251
|
+
exitCode !== 0
|
|
252
|
+
? `Command failed with exit code: ${exitCode}`
|
|
253
|
+
: undefined,
|
|
254
|
+
});
|
|
255
|
+
})
|
|
256
|
+
.catch((error) => {
|
|
257
|
+
logger.warn(`Error handling large output: ${error}`);
|
|
258
|
+
resolve({
|
|
259
|
+
success: exitCode === 0,
|
|
260
|
+
content: finalOutput,
|
|
261
|
+
error:
|
|
262
|
+
exitCode !== 0
|
|
263
|
+
? `Command failed with exit code: ${exitCode}`
|
|
264
|
+
: undefined,
|
|
265
|
+
});
|
|
266
|
+
});
|
|
204
267
|
}
|
|
205
268
|
});
|
|
206
269
|
|
|
@@ -219,9 +282,15 @@ export const bashTool: ToolPlugin = {
|
|
|
219
282
|
});
|
|
220
283
|
},
|
|
221
284
|
formatCompactParams: (params: Record<string, unknown>) => {
|
|
285
|
+
const description = params.description as string;
|
|
222
286
|
const command = params.command as string;
|
|
223
287
|
const runInBackground = params.run_in_background as boolean;
|
|
224
|
-
|
|
288
|
+
|
|
289
|
+
if (description) {
|
|
290
|
+
return description;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return `${command}${runInBackground ? " (background)" : ""}`;
|
|
225
294
|
},
|
|
226
295
|
};
|
|
227
296
|
|
|
@@ -298,15 +367,20 @@ export const bashOutputTool: ToolPlugin = {
|
|
|
298
367
|
|
|
299
368
|
let content = "";
|
|
300
369
|
if (output.stdout) {
|
|
301
|
-
content += output.stdout;
|
|
370
|
+
content += stripAnsiColors(output.stdout);
|
|
302
371
|
}
|
|
303
372
|
if (output.stderr) {
|
|
304
|
-
content += (content ? "\n" : "") + output.stderr;
|
|
373
|
+
content += (content ? "\n" : "") + stripAnsiColors(output.stderr);
|
|
305
374
|
}
|
|
306
375
|
|
|
376
|
+
const finalContent = content || "No output available";
|
|
377
|
+
const { content: processedContent, filePath } =
|
|
378
|
+
await handleLargeOutput(finalContent);
|
|
379
|
+
|
|
307
380
|
return {
|
|
308
381
|
success: true,
|
|
309
|
-
content:
|
|
382
|
+
content: processedContent,
|
|
383
|
+
filePath,
|
|
310
384
|
shortResult: `${bashId}: ${output.status}${shell.exitCode !== undefined ? ` (${shell.exitCode})` : ""}`,
|
|
311
385
|
error: undefined,
|
|
312
386
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { unlink } from "fs/promises";
|
|
2
|
+
import { logger } from "../utils/globalLogger.js";
|
|
2
3
|
import type { ToolPlugin, ToolResult, ToolContext } from "./types.js";
|
|
3
4
|
import { resolvePath, getDisplayPath } from "../utils/path.js";
|
|
4
5
|
|
|
@@ -45,10 +46,46 @@ export const deleteFileTool: ToolPlugin = {
|
|
|
45
46
|
try {
|
|
46
47
|
const filePath = resolvePath(targetFile, context.workdir);
|
|
47
48
|
|
|
49
|
+
// Permission check after validation but before real operation
|
|
50
|
+
if (
|
|
51
|
+
context.permissionManager &&
|
|
52
|
+
context.permissionMode &&
|
|
53
|
+
context.permissionMode !== "bypassPermissions"
|
|
54
|
+
) {
|
|
55
|
+
if (context.permissionManager.isRestrictedTool("Delete")) {
|
|
56
|
+
try {
|
|
57
|
+
const permissionContext = context.permissionManager.createContext(
|
|
58
|
+
"Delete",
|
|
59
|
+
context.permissionMode,
|
|
60
|
+
context.canUseToolCallback,
|
|
61
|
+
{ target_file: targetFile },
|
|
62
|
+
);
|
|
63
|
+
const permissionResult =
|
|
64
|
+
await context.permissionManager.checkPermission(
|
|
65
|
+
permissionContext,
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
if (permissionResult.behavior === "deny") {
|
|
69
|
+
return {
|
|
70
|
+
success: false,
|
|
71
|
+
content: "",
|
|
72
|
+
error: `Delete operation denied by user, reason: ${permissionResult.message || "No reason provided"}`,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
} catch {
|
|
76
|
+
return {
|
|
77
|
+
success: false,
|
|
78
|
+
content: "",
|
|
79
|
+
error: "Permission check failed",
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
48
85
|
// Delete file
|
|
49
86
|
await unlink(filePath);
|
|
50
87
|
|
|
51
|
-
|
|
88
|
+
logger.debug(`Successfully deleted file: ${filePath}`);
|
|
52
89
|
|
|
53
90
|
return {
|
|
54
91
|
success: true,
|
package/src/tools/editTool.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readFile, writeFile } from "fs/promises";
|
|
2
|
+
import { logger } from "../utils/globalLogger.js";
|
|
2
3
|
import type { ToolPlugin, ToolResult, ToolContext } from "./types.js";
|
|
3
4
|
import { resolvePath, getDisplayPath } from "../utils/path.js";
|
|
4
|
-
import { diffLines } from "diff";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Format compact parameter display
|
|
@@ -142,6 +142,47 @@ export const editTool: ToolPlugin = {
|
|
|
142
142
|
replacementCount = 1;
|
|
143
143
|
}
|
|
144
144
|
|
|
145
|
+
// Permission check after validation but before real operation
|
|
146
|
+
if (
|
|
147
|
+
context.permissionManager &&
|
|
148
|
+
context.permissionMode &&
|
|
149
|
+
context.permissionMode !== "bypassPermissions"
|
|
150
|
+
) {
|
|
151
|
+
if (context.permissionManager.isRestrictedTool("Edit")) {
|
|
152
|
+
try {
|
|
153
|
+
const permissionContext = context.permissionManager.createContext(
|
|
154
|
+
"Edit",
|
|
155
|
+
context.permissionMode,
|
|
156
|
+
context.canUseToolCallback,
|
|
157
|
+
{
|
|
158
|
+
file_path: filePath,
|
|
159
|
+
old_string: oldString,
|
|
160
|
+
new_string: newString,
|
|
161
|
+
replace_all: replaceAll,
|
|
162
|
+
},
|
|
163
|
+
);
|
|
164
|
+
const permissionResult =
|
|
165
|
+
await context.permissionManager.checkPermission(
|
|
166
|
+
permissionContext,
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
if (permissionResult.behavior === "deny") {
|
|
170
|
+
return {
|
|
171
|
+
success: false,
|
|
172
|
+
content: "",
|
|
173
|
+
error: `Edit operation denied by user, reason: ${permissionResult.message || "No reason provided"}`,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
} catch {
|
|
177
|
+
return {
|
|
178
|
+
success: false,
|
|
179
|
+
content: "",
|
|
180
|
+
error: "Permission check failed",
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
145
186
|
// Write file
|
|
146
187
|
try {
|
|
147
188
|
await writeFile(resolvedPath, newContent, "utf-8");
|
|
@@ -153,28 +194,22 @@ export const editTool: ToolPlugin = {
|
|
|
153
194
|
};
|
|
154
195
|
}
|
|
155
196
|
|
|
156
|
-
// Generate diff information
|
|
157
|
-
const diffResult = diffLines(originalContent, newContent);
|
|
158
|
-
|
|
159
197
|
const shortResult = replaceAll
|
|
160
198
|
? `Replaced ${replacementCount} instances`
|
|
161
199
|
: "Text replaced successfully";
|
|
162
200
|
|
|
163
|
-
|
|
201
|
+
logger.debug(`Edit tool: ${shortResult}`);
|
|
164
202
|
|
|
165
203
|
return {
|
|
166
204
|
success: true,
|
|
167
205
|
content: shortResult,
|
|
168
206
|
shortResult,
|
|
169
207
|
filePath: resolvedPath,
|
|
170
|
-
originalContent,
|
|
171
|
-
newContent,
|
|
172
|
-
diffResult,
|
|
173
208
|
};
|
|
174
209
|
} catch (error) {
|
|
175
210
|
const errorMessage =
|
|
176
211
|
error instanceof Error ? error.message : String(error);
|
|
177
|
-
|
|
212
|
+
logger.error(`Edit tool error: ${errorMessage}`);
|
|
178
213
|
return {
|
|
179
214
|
success: false,
|
|
180
215
|
content: "",
|