wave-agent-sdk 0.2.1 → 0.5.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 (194) hide show
  1. package/dist/agent.d.ts +66 -20
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +156 -83
  4. package/dist/constants/prompts.d.ts +7 -2
  5. package/dist/constants/prompts.d.ts.map +1 -1
  6. package/dist/constants/prompts.js +41 -5
  7. package/dist/constants/tools.d.ts +2 -2
  8. package/dist/constants/tools.js +2 -2
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +1 -1
  12. package/dist/managers/MemoryRuleManager.d.ts.map +1 -1
  13. package/dist/managers/MemoryRuleManager.js +16 -2
  14. package/dist/managers/aiManager.d.ts +14 -4
  15. package/dist/managers/aiManager.d.ts.map +1 -1
  16. package/dist/managers/aiManager.js +61 -9
  17. package/dist/managers/backgroundBashManager.d.ts.map +1 -1
  18. package/dist/managers/backgroundBashManager.js +1 -0
  19. package/dist/managers/backgroundTaskManager.d.ts +35 -0
  20. package/dist/managers/backgroundTaskManager.d.ts.map +1 -0
  21. package/dist/managers/backgroundTaskManager.js +249 -0
  22. package/dist/managers/bashManager.d.ts.map +1 -1
  23. package/dist/managers/bashManager.js +0 -3
  24. package/dist/managers/foregroundTaskManager.d.ts +9 -0
  25. package/dist/managers/foregroundTaskManager.d.ts.map +1 -0
  26. package/dist/managers/foregroundTaskManager.js +20 -0
  27. package/dist/managers/liveConfigManager.d.ts +1 -1
  28. package/dist/managers/liveConfigManager.d.ts.map +1 -1
  29. package/dist/managers/lspManager.d.ts.map +1 -1
  30. package/dist/managers/lspManager.js +3 -1
  31. package/dist/managers/messageManager.d.ts +34 -4
  32. package/dist/managers/messageManager.d.ts.map +1 -1
  33. package/dist/managers/messageManager.js +104 -13
  34. package/dist/managers/permissionManager.d.ts.map +1 -1
  35. package/dist/managers/permissionManager.js +11 -13
  36. package/dist/managers/pluginManager.d.ts.map +1 -1
  37. package/dist/managers/pluginManager.js +3 -2
  38. package/dist/managers/pluginScopeManager.d.ts +13 -2
  39. package/dist/managers/pluginScopeManager.d.ts.map +1 -1
  40. package/dist/managers/pluginScopeManager.js +38 -0
  41. package/dist/managers/reversionManager.d.ts +39 -0
  42. package/dist/managers/reversionManager.d.ts.map +1 -0
  43. package/dist/managers/reversionManager.js +118 -0
  44. package/dist/managers/slashCommandManager.d.ts +4 -1
  45. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  46. package/dist/managers/slashCommandManager.js +16 -6
  47. package/dist/managers/subagentManager.d.ts +13 -2
  48. package/dist/managers/subagentManager.d.ts.map +1 -1
  49. package/dist/managers/subagentManager.js +144 -35
  50. package/dist/managers/toolManager.d.ts +11 -1
  51. package/dist/managers/toolManager.d.ts.map +1 -1
  52. package/dist/managers/toolManager.js +11 -3
  53. package/dist/services/GitService.d.ts.map +1 -1
  54. package/dist/services/GitService.js +6 -2
  55. package/dist/services/MarketplaceService.d.ts +14 -1
  56. package/dist/services/MarketplaceService.d.ts.map +1 -1
  57. package/dist/services/MarketplaceService.js +72 -4
  58. package/dist/services/MemoryRuleService.d.ts +1 -1
  59. package/dist/services/MemoryRuleService.d.ts.map +1 -1
  60. package/dist/services/MemoryRuleService.js +13 -2
  61. package/dist/services/aiService.js +1 -1
  62. package/dist/services/configurationService.d.ts +18 -2
  63. package/dist/services/configurationService.d.ts.map +1 -1
  64. package/dist/services/configurationService.js +62 -0
  65. package/dist/services/fileWatcher.d.ts +0 -5
  66. package/dist/services/fileWatcher.d.ts.map +1 -1
  67. package/dist/services/fileWatcher.js +0 -11
  68. package/dist/services/memory.js +1 -1
  69. package/dist/services/pluginLoader.d.ts.map +1 -1
  70. package/dist/services/pluginLoader.js +6 -1
  71. package/dist/services/reversionService.d.ts +24 -0
  72. package/dist/services/reversionService.d.ts.map +1 -0
  73. package/dist/services/reversionService.js +76 -0
  74. package/dist/services/session.d.ts +7 -0
  75. package/dist/services/session.d.ts.map +1 -1
  76. package/dist/services/session.js +126 -3
  77. package/dist/tools/bashTool.d.ts +0 -8
  78. package/dist/tools/bashTool.d.ts.map +1 -1
  79. package/dist/tools/bashTool.js +52 -174
  80. package/dist/tools/deleteFileTool.d.ts.map +1 -1
  81. package/dist/tools/deleteFileTool.js +9 -0
  82. package/dist/tools/editTool.d.ts.map +1 -1
  83. package/dist/tools/editTool.js +15 -4
  84. package/dist/tools/multiEditTool.d.ts.map +1 -1
  85. package/dist/tools/multiEditTool.js +16 -5
  86. package/dist/tools/taskOutputTool.d.ts +3 -0
  87. package/dist/tools/taskOutputTool.d.ts.map +1 -0
  88. package/dist/tools/taskOutputTool.js +149 -0
  89. package/dist/tools/taskStopTool.d.ts +3 -0
  90. package/dist/tools/taskStopTool.d.ts.map +1 -0
  91. package/dist/tools/taskStopTool.js +65 -0
  92. package/dist/tools/taskTool.d.ts.map +1 -1
  93. package/dist/tools/taskTool.js +105 -63
  94. package/dist/tools/types.d.ts +7 -0
  95. package/dist/tools/types.d.ts.map +1 -1
  96. package/dist/tools/writeTool.d.ts.map +1 -1
  97. package/dist/tools/writeTool.js +9 -0
  98. package/dist/types/commands.d.ts +1 -0
  99. package/dist/types/commands.d.ts.map +1 -1
  100. package/dist/types/configuration.d.ts +3 -0
  101. package/dist/types/configuration.d.ts.map +1 -1
  102. package/dist/types/environment.d.ts +2 -1
  103. package/dist/types/environment.d.ts.map +1 -1
  104. package/dist/types/environment.js +0 -6
  105. package/dist/types/history.d.ts +5 -0
  106. package/dist/types/history.d.ts.map +1 -0
  107. package/dist/types/history.js +1 -0
  108. package/dist/types/index.d.ts +1 -0
  109. package/dist/types/index.d.ts.map +1 -1
  110. package/dist/types/index.js +1 -0
  111. package/dist/types/marketplace.d.ts +4 -0
  112. package/dist/types/marketplace.d.ts.map +1 -1
  113. package/dist/types/messaging.d.ts +7 -1
  114. package/dist/types/messaging.d.ts.map +1 -1
  115. package/dist/types/processes.d.ts +24 -4
  116. package/dist/types/processes.d.ts.map +1 -1
  117. package/dist/types/reversion.d.ts +29 -0
  118. package/dist/types/reversion.d.ts.map +1 -0
  119. package/dist/types/reversion.js +1 -0
  120. package/dist/utils/builtinSubagents.d.ts.map +1 -1
  121. package/dist/utils/builtinSubagents.js +16 -0
  122. package/dist/utils/constants.d.ts +2 -2
  123. package/dist/utils/constants.d.ts.map +1 -1
  124. package/dist/utils/constants.js +2 -2
  125. package/dist/utils/editUtils.d.ts +4 -9
  126. package/dist/utils/editUtils.d.ts.map +1 -1
  127. package/dist/utils/editUtils.js +54 -55
  128. package/dist/utils/messageOperations.d.ts +3 -1
  129. package/dist/utils/messageOperations.d.ts.map +1 -1
  130. package/dist/utils/messageOperations.js +8 -1
  131. package/dist/utils/openaiClient.d.ts.map +1 -1
  132. package/dist/utils/openaiClient.js +56 -26
  133. package/dist/utils/promptHistory.d.ts +20 -0
  134. package/dist/utils/promptHistory.d.ts.map +1 -0
  135. package/dist/utils/promptHistory.js +117 -0
  136. package/package.json +5 -3
  137. package/src/agent.ts +193 -109
  138. package/src/constants/prompts.ts +45 -5
  139. package/src/constants/tools.ts +2 -2
  140. package/src/index.ts +1 -1
  141. package/src/managers/MemoryRuleManager.ts +18 -2
  142. package/src/managers/aiManager.ts +87 -18
  143. package/src/managers/backgroundBashManager.ts +1 -0
  144. package/src/managers/backgroundTaskManager.ts +306 -0
  145. package/src/managers/bashManager.ts +0 -4
  146. package/src/managers/foregroundTaskManager.ts +26 -0
  147. package/src/managers/liveConfigManager.ts +2 -1
  148. package/src/managers/lspManager.ts +3 -1
  149. package/src/managers/messageManager.ts +136 -18
  150. package/src/managers/permissionManager.ts +11 -13
  151. package/src/managers/pluginManager.ts +4 -3
  152. package/src/managers/pluginScopeManager.ts +57 -8
  153. package/src/managers/reversionManager.ts +152 -0
  154. package/src/managers/slashCommandManager.ts +30 -7
  155. package/src/managers/subagentManager.ts +176 -31
  156. package/src/managers/toolManager.ts +23 -4
  157. package/src/services/GitService.ts +6 -2
  158. package/src/services/MarketplaceService.ts +100 -4
  159. package/src/services/MemoryRuleService.ts +18 -6
  160. package/src/services/aiService.ts +1 -1
  161. package/src/services/configurationService.ts +79 -1
  162. package/src/services/fileWatcher.ts +0 -13
  163. package/src/services/memory.ts +1 -1
  164. package/src/services/pluginLoader.ts +7 -1
  165. package/src/services/reversionService.ts +94 -0
  166. package/src/services/session.ts +161 -3
  167. package/src/tools/bashTool.ts +73 -200
  168. package/src/tools/deleteFileTool.ts +15 -0
  169. package/src/tools/editTool.ts +20 -10
  170. package/src/tools/multiEditTool.ts +21 -11
  171. package/src/tools/taskOutputTool.ts +174 -0
  172. package/src/tools/taskStopTool.ts +72 -0
  173. package/src/tools/taskTool.ts +130 -74
  174. package/src/tools/types.ts +7 -0
  175. package/src/tools/writeTool.ts +14 -0
  176. package/src/types/commands.ts +3 -0
  177. package/src/types/configuration.ts +4 -0
  178. package/src/types/environment.ts +3 -1
  179. package/src/types/history.ts +4 -0
  180. package/src/types/index.ts +1 -0
  181. package/src/types/marketplace.ts +5 -0
  182. package/src/types/messaging.ts +9 -1
  183. package/src/types/processes.ts +33 -4
  184. package/src/types/reversion.ts +29 -0
  185. package/src/utils/builtinSubagents.ts +18 -0
  186. package/src/utils/constants.ts +2 -2
  187. package/src/utils/editUtils.ts +66 -58
  188. package/src/utils/messageOperations.ts +10 -0
  189. package/src/utils/openaiClient.ts +69 -35
  190. package/src/utils/promptHistory.ts +133 -0
  191. package/dist/utils/bashHistory.d.ts +0 -50
  192. package/dist/utils/bashHistory.d.ts.map +0 -1
  193. package/dist/utils/bashHistory.js +0 -256
  194. package/src/utils/bashHistory.ts +0 -320
@@ -1,7 +1,7 @@
1
1
  import { spawn } from "child_process";
2
2
  import { logger } from "../utils/globalLogger.js";
3
3
  import { stripAnsiColors } from "../utils/stringUtils.js";
4
- import { BASH_TOOL_NAME, BASH_OUTPUT_TOOL_NAME, KILL_BASH_TOOL_NAME, GLOB_TOOL_NAME, GREP_TOOL_NAME, READ_TOOL_NAME, EDIT_TOOL_NAME, WRITE_TOOL_NAME, } from "../constants/tools.js";
4
+ import { BASH_TOOL_NAME, TASK_OUTPUT_TOOL_NAME, GLOB_TOOL_NAME, GREP_TOOL_NAME, READ_TOOL_NAME, EDIT_TOOL_NAME, WRITE_TOOL_NAME, } from "../constants/tools.js";
5
5
  const MAX_OUTPUT_LENGTH = 30000;
6
6
  const BASH_DEFAULT_TIMEOUT_MS = 120000;
7
7
  /**
@@ -76,7 +76,7 @@ Usage notes:
76
76
  },
77
77
  run_in_background: {
78
78
  type: "boolean",
79
- description: `Set to true to run this command in the background. Use ${BASH_OUTPUT_TOOL_NAME} to read the output later.`,
79
+ description: `Set to true to run this command in the background. Use ${TASK_OUTPUT_TOOL_NAME} to read the output later.`,
80
80
  },
81
81
  },
82
82
  required: ["command"],
@@ -135,19 +135,19 @@ Usage notes:
135
135
  }
136
136
  if (runInBackground) {
137
137
  // Background execution
138
- const backgroundBashManager = context?.backgroundBashManager;
139
- if (!backgroundBashManager) {
138
+ const backgroundTaskManager = context?.backgroundTaskManager;
139
+ if (!backgroundTaskManager) {
140
140
  return {
141
141
  success: false,
142
142
  content: "",
143
- error: "Background bash manager not available",
143
+ error: "Background task manager not available",
144
144
  };
145
145
  }
146
- const shellId = backgroundBashManager.startShell(command, timeout);
146
+ const { id: taskId } = backgroundTaskManager.startShell(command, timeout);
147
147
  return {
148
148
  success: true,
149
- content: `Command started in background with ID: ${shellId}. Use ${BASH_OUTPUT_TOOL_NAME} tool with bash_id="${shellId}" to monitor output.`,
150
- shortResult: `Background process ${shellId} started`,
149
+ content: `Command started in background with ID: ${taskId}. Use TaskOutput tool with task_id="${taskId}" to monitor output.`,
150
+ shortResult: `Background process ${taskId} started`,
151
151
  };
152
152
  }
153
153
  // Foreground execution (original behavior)
@@ -163,6 +163,32 @@ Usage notes:
163
163
  let outputBuffer = "";
164
164
  let errorBuffer = "";
165
165
  let isAborted = false;
166
+ let isBackgrounded = false;
167
+ const foregroundTaskId = `bash_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
168
+ // Register as foreground task
169
+ if (context.foregroundTaskManager && command) {
170
+ context.foregroundTaskManager.registerForegroundTask({
171
+ id: foregroundTaskId,
172
+ backgroundHandler: async () => {
173
+ isBackgrounded = true;
174
+ if (timeoutHandle) {
175
+ clearTimeout(timeoutHandle);
176
+ }
177
+ const backgroundTaskManager = context.backgroundTaskManager;
178
+ if (backgroundTaskManager) {
179
+ const taskId = backgroundTaskManager.adoptProcess(child, command, outputBuffer, errorBuffer);
180
+ resolve({
181
+ success: true,
182
+ content: `Command moved to background with ID: ${taskId}. Use TaskOutput tool with task_id="${taskId}" to monitor output.`,
183
+ shortResult: `Process ${taskId} backgrounded`,
184
+ });
185
+ }
186
+ else {
187
+ handleAbort("Failed to background: Background task manager not available");
188
+ }
189
+ },
190
+ });
191
+ }
166
192
  // Set up timeout
167
193
  let timeoutHandle;
168
194
  if (timeout && timeout > 0) {
@@ -221,26 +247,35 @@ Usage notes:
221
247
  // Handle abort signal from context
222
248
  if (context?.abortSignal) {
223
249
  if (context.abortSignal.aborted) {
224
- handleAbort();
250
+ if (!isBackgrounded) {
251
+ handleAbort();
252
+ }
225
253
  return;
226
254
  }
227
255
  // Use { once: true } to prevent listener accumulation on signal reuse
228
- context.abortSignal.addEventListener("abort", () => handleAbort(), {
256
+ context.abortSignal.addEventListener("abort", () => {
257
+ if (!isBackgrounded) {
258
+ handleAbort();
259
+ }
260
+ }, {
229
261
  once: true,
230
262
  });
231
263
  }
232
264
  child.stdout?.on("data", (data) => {
233
- if (!isAborted) {
265
+ if (!isAborted && !isBackgrounded) {
234
266
  outputBuffer += stripAnsiColors(data.toString());
235
267
  }
236
268
  });
237
269
  child.stderr?.on("data", (data) => {
238
- if (!isAborted) {
270
+ if (!isAborted && !isBackgrounded) {
239
271
  errorBuffer += stripAnsiColors(data.toString());
240
272
  }
241
273
  });
242
274
  child.on("exit", (code) => {
243
- if (!isAborted) {
275
+ if (context.foregroundTaskManager) {
276
+ context.foregroundTaskManager.unregisterForegroundTask(foregroundTaskId);
277
+ }
278
+ if (!isAborted && !isBackgrounded) {
244
279
  if (timeoutHandle) {
245
280
  clearTimeout(timeoutHandle);
246
281
  }
@@ -262,7 +297,10 @@ Usage notes:
262
297
  }
263
298
  });
264
299
  child.on("error", (error) => {
265
- if (!isAborted) {
300
+ if (context.foregroundTaskManager) {
301
+ context.foregroundTaskManager.unregisterForegroundTask(foregroundTaskId);
302
+ }
303
+ if (!isAborted && !isBackgrounded) {
266
304
  if (timeoutHandle) {
267
305
  clearTimeout(timeoutHandle);
268
306
  }
@@ -285,163 +323,3 @@ Usage notes:
285
323
  return `${command}${runInBackground ? " (background)" : ""}`;
286
324
  },
287
325
  };
288
- /**
289
- * BashOutput tool - retrieves output from background bash shells
290
- */
291
- export const bashOutputTool = {
292
- name: BASH_OUTPUT_TOOL_NAME,
293
- config: {
294
- type: "function",
295
- function: {
296
- name: BASH_OUTPUT_TOOL_NAME,
297
- description: "Retrieves output from a running or completed background bash shell",
298
- parameters: {
299
- type: "object",
300
- properties: {
301
- bash_id: {
302
- type: "string",
303
- description: "The ID of the background shell to retrieve output from",
304
- },
305
- filter: {
306
- type: "string",
307
- description: "Optional regular expression to filter the output lines. Only lines matching this regex will be included in the result. Any lines that do not match will no longer be available to read.",
308
- },
309
- },
310
- required: ["bash_id"],
311
- },
312
- },
313
- },
314
- execute: async (args, context) => {
315
- const bashId = args.bash_id;
316
- const filter = args.filter;
317
- if (!bashId || typeof bashId !== "string") {
318
- return {
319
- success: false,
320
- content: "",
321
- error: "bash_id parameter is required and must be a string",
322
- };
323
- }
324
- const backgroundBashManager = context?.backgroundBashManager;
325
- if (!backgroundBashManager) {
326
- return {
327
- success: false,
328
- content: "",
329
- error: "Background bash manager not available",
330
- };
331
- }
332
- const output = backgroundBashManager.getOutput(bashId, filter);
333
- if (!output) {
334
- return {
335
- success: false,
336
- content: "",
337
- error: `Background shell with ID ${bashId} not found`,
338
- };
339
- }
340
- const shell = backgroundBashManager.getShell(bashId);
341
- if (!shell) {
342
- return {
343
- success: false,
344
- content: "",
345
- error: `Background shell with ID ${bashId} not found`,
346
- };
347
- }
348
- let content = "";
349
- if (output.stdout) {
350
- content += stripAnsiColors(output.stdout);
351
- }
352
- if (output.stderr) {
353
- content += (content ? "\n" : "") + stripAnsiColors(output.stderr);
354
- }
355
- const finalContent = content || "No output available";
356
- const processedContent = finalContent.length > MAX_OUTPUT_LENGTH
357
- ? finalContent.substring(0, MAX_OUTPUT_LENGTH) +
358
- "\n\n... (output truncated)"
359
- : finalContent;
360
- return {
361
- success: true,
362
- content: processedContent,
363
- shortResult: `${bashId}: ${output.status}${shell.exitCode !== undefined ? ` (${shell.exitCode})` : ""}`,
364
- error: undefined,
365
- };
366
- },
367
- formatCompactParams: (params) => {
368
- const bashId = params.bash_id;
369
- const filter = params.filter;
370
- return filter ? `${bashId} filtered: ${filter}` : bashId;
371
- },
372
- };
373
- /**
374
- * KillBash tool - kills a running background bash shell
375
- */
376
- export const killBashTool = {
377
- name: KILL_BASH_TOOL_NAME,
378
- config: {
379
- type: "function",
380
- function: {
381
- name: KILL_BASH_TOOL_NAME,
382
- description: "Kills a running background bash shell by its ID",
383
- parameters: {
384
- type: "object",
385
- properties: {
386
- shell_id: {
387
- type: "string",
388
- description: "The ID of the background shell to kill",
389
- },
390
- },
391
- required: ["shell_id"],
392
- },
393
- },
394
- },
395
- execute: async (args, context) => {
396
- const shellId = args.shell_id;
397
- if (!shellId || typeof shellId !== "string") {
398
- return {
399
- success: false,
400
- content: "",
401
- error: "shell_id parameter is required and must be a string",
402
- };
403
- }
404
- const backgroundBashManager = context?.backgroundBashManager;
405
- if (!backgroundBashManager) {
406
- return {
407
- success: false,
408
- content: "",
409
- error: "Background bash manager not available",
410
- };
411
- }
412
- const shell = backgroundBashManager.getShell(shellId);
413
- if (!shell) {
414
- return {
415
- success: false,
416
- content: "",
417
- error: `Background shell with ID ${shellId} not found`,
418
- };
419
- }
420
- if (shell.status !== "running") {
421
- return {
422
- success: false,
423
- content: "",
424
- error: `Background shell ${shellId} is not running (status: ${shell.status})`,
425
- };
426
- }
427
- const killed = backgroundBashManager.killShell(shellId);
428
- if (killed) {
429
- return {
430
- success: true,
431
- content: `Background shell ${shellId} has been killed`,
432
- shortResult: `Killed ${shellId}`,
433
- };
434
- }
435
- else {
436
- return {
437
- success: false,
438
- content: "",
439
- error: `Failed to kill background shell ${shellId}`,
440
- };
441
- }
442
- },
443
- formatCompactParams: (params) => {
444
- const shellId = params.shell_id;
445
- return shellId;
446
- },
447
- };
@@ -1 +1 @@
1
- {"version":3,"file":"deleteFileTool.d.ts","sourceRoot":"","sources":["../../src/tools/deleteFileTool.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAItE;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,UAsG5B,CAAC"}
1
+ {"version":3,"file":"deleteFileTool.d.ts","sourceRoot":"","sources":["../../src/tools/deleteFileTool.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAItE;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,UAqH5B,CAAC"}
@@ -60,8 +60,17 @@ export const deleteFileTool = {
60
60
  };
61
61
  }
62
62
  }
63
+ // Record snapshot for reversion
64
+ let snapshotId;
65
+ if (context.reversionManager && context.messageId) {
66
+ snapshotId = await context.reversionManager.recordSnapshot(context.messageId, filePath, "delete");
67
+ }
63
68
  // Delete file
64
69
  await unlink(filePath);
70
+ // Commit snapshot on success
71
+ if (context.reversionManager && snapshotId) {
72
+ await context.reversionManager.commitSnapshot(snapshotId);
73
+ }
65
74
  logger.debug(`Successfully deleted file: ${filePath}`);
66
75
  return {
67
76
  success: true,
@@ -1 +1 @@
1
- {"version":3,"file":"editTool.d.ts","sourceRoot":"","sources":["../../src/tools/editTool.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAmBtE;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,UAoMtB,CAAC"}
1
+ {"version":3,"file":"editTool.d.ts","sourceRoot":"","sources":["../../src/tools/editTool.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAgBtE;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,UAiNtB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { readFile, writeFile } from "fs/promises";
2
2
  import { logger } from "../utils/globalLogger.js";
3
3
  import { resolvePath, getDisplayPath } from "../utils/path.js";
4
- import { findIndentationInsensitiveMatch, escapeRegExp, } from "../utils/editUtils.js";
4
+ import { escapeRegExp, analyzeEditMismatch } from "../utils/editUtils.js";
5
5
  import { EDIT_TOOL_NAME, READ_TOOL_NAME } from "../constants/tools.js";
6
6
  /**
7
7
  * Format compact parameter display
@@ -95,13 +95,15 @@ export const editTool = {
95
95
  error: `Failed to read file: ${readError instanceof Error ? readError.message : String(readError)}`,
96
96
  };
97
97
  }
98
- // Check if old_string exists (with smart indentation matching)
99
- const matchedOldString = findIndentationInsensitiveMatch(originalContent, oldString);
98
+ // Check if old_string exists
99
+ const matchedOldString = originalContent.includes(oldString)
100
+ ? oldString
101
+ : null;
100
102
  if (!matchedOldString) {
101
103
  return {
102
104
  success: false,
103
105
  content: "",
104
- error: `old_string not found in file`,
106
+ error: analyzeEditMismatch(originalContent, oldString),
105
107
  };
106
108
  }
107
109
  let newContent;
@@ -151,9 +153,18 @@ export const editTool = {
151
153
  };
152
154
  }
153
155
  }
156
+ // Record snapshot for reversion
157
+ let snapshotId;
158
+ if (context.reversionManager && context.messageId) {
159
+ snapshotId = await context.reversionManager.recordSnapshot(context.messageId, resolvedPath, "modify");
160
+ }
154
161
  // Write file
155
162
  try {
156
163
  await writeFile(resolvedPath, newContent, "utf-8");
164
+ // Commit snapshot on success
165
+ if (context.reversionManager && snapshotId) {
166
+ await context.reversionManager.commitSnapshot(snapshotId);
167
+ }
157
168
  }
158
169
  catch (writeError) {
159
170
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"multiEditTool.d.ts","sourceRoot":"","sources":["../../src/tools/multiEditTool.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAgCtE;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,UAkQ3B,CAAC"}
1
+ {"version":3,"file":"multiEditTool.d.ts","sourceRoot":"","sources":["../../src/tools/multiEditTool.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AA6BtE;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,UA+Q3B,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { readFile, writeFile } from "fs/promises";
2
2
  import { logger } from "../utils/globalLogger.js";
3
3
  import { resolvePath, getDisplayPath } from "../utils/path.js";
4
- import { findIndentationInsensitiveMatch, escapeRegExp, } from "../utils/editUtils.js";
4
+ import { escapeRegExp, analyzeEditMismatch } from "../utils/editUtils.js";
5
5
  import { MULTI_EDIT_TOOL_NAME, EDIT_TOOL_NAME, READ_TOOL_NAME, } from "../constants/tools.js";
6
6
  /**
7
7
  * Format compact parameter display
@@ -147,19 +147,21 @@ export const multiEditTool = {
147
147
  appliedEdits.push(`Created file with content (${edit.new_string.length} characters)`);
148
148
  continue;
149
149
  }
150
- // Check if old_string exists (with smart indentation matching)
151
- const matchedOldString = findIndentationInsensitiveMatch(currentContent, edit.old_string);
150
+ // Check if old_string exists
151
+ const matchedOldString = currentContent.includes(edit.old_string)
152
+ ? edit.old_string
153
+ : null;
152
154
  if (!matchedOldString) {
153
155
  return {
154
156
  success: false,
155
157
  content: "",
156
- error: `Edit operation ${i + 1}: old_string not found in current content`,
158
+ error: `Edit operation ${i + 1}: ${analyzeEditMismatch(currentContent, edit.old_string)}`,
157
159
  };
158
160
  }
159
161
  let replacementCount;
160
162
  if (replaceAll) {
161
163
  // Replace all matches
162
- const regex = new RegExp(escapeRegExp(matchedOldString), "g");
164
+ const regex = new RegExp(escapeRegExp(edit.old_string), "g");
163
165
  currentContent = currentContent.replace(regex, edit.new_string);
164
166
  replacementCount = (currentContent.match(regex) || []).length;
165
167
  appliedEdits.push(`Replaced ${replacementCount} instances of "${edit.old_string.substring(0, 50)}${edit.old_string.length > 50 ? "..." : ""}"`);
@@ -199,9 +201,18 @@ export const multiEditTool = {
199
201
  };
200
202
  }
201
203
  }
204
+ // Record snapshot for reversion
205
+ let snapshotId;
206
+ if (context.reversionManager && context.messageId) {
207
+ snapshotId = await context.reversionManager.recordSnapshot(context.messageId, resolvedPath, isNewFile ? "create" : "modify");
208
+ }
202
209
  // Write file
203
210
  try {
204
211
  await writeFile(resolvedPath, currentContent, "utf-8");
212
+ // Commit snapshot on success
213
+ if (context.reversionManager && snapshotId) {
214
+ await context.reversionManager.commitSnapshot(snapshotId);
215
+ }
205
216
  }
206
217
  catch (writeError) {
207
218
  return {
@@ -0,0 +1,3 @@
1
+ import { ToolPlugin } from "./types.js";
2
+ export declare const taskOutputTool: ToolPlugin;
3
+ //# sourceMappingURL=taskOutputTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskOutputTool.d.ts","sourceRoot":"","sources":["../../src/tools/taskOutputTool.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,UAAU,EAAc,MAAM,YAAY,CAAC;AAKjE,eAAO,MAAM,cAAc,EAAE,UAuK5B,CAAC"}
@@ -0,0 +1,149 @@
1
+ import { TASK_OUTPUT_TOOL_NAME } from "../constants/tools.js";
2
+ import { stripAnsiColors } from "../utils/stringUtils.js";
3
+ const MAX_OUTPUT_LENGTH = 30000;
4
+ export const taskOutputTool = {
5
+ name: TASK_OUTPUT_TOOL_NAME,
6
+ config: {
7
+ type: "function",
8
+ function: {
9
+ name: TASK_OUTPUT_TOOL_NAME,
10
+ description: "Retrieves output from a running or completed background task",
11
+ parameters: {
12
+ type: "object",
13
+ properties: {
14
+ task_id: {
15
+ type: "string",
16
+ description: "The ID of the background task to retrieve output from",
17
+ },
18
+ filter: {
19
+ type: "string",
20
+ description: "Optional regular expression to filter the output lines.",
21
+ },
22
+ block: {
23
+ type: "boolean",
24
+ description: "If true, wait for the task to complete before returning output. If false, return current output immediately.",
25
+ },
26
+ },
27
+ required: ["task_id"],
28
+ },
29
+ },
30
+ },
31
+ execute: async (args, context) => {
32
+ const taskId = args.task_id;
33
+ const filter = args.filter;
34
+ const block = args.block;
35
+ if (!taskId || typeof taskId !== "string") {
36
+ return {
37
+ success: false,
38
+ content: "",
39
+ error: "task_id parameter is required and must be a string",
40
+ };
41
+ }
42
+ const backgroundTaskManager = context?.backgroundTaskManager;
43
+ if (!backgroundTaskManager) {
44
+ return {
45
+ success: false,
46
+ content: "",
47
+ error: "Background task manager not available",
48
+ };
49
+ }
50
+ const getResult = () => {
51
+ const output = backgroundTaskManager.getOutput(taskId, filter);
52
+ if (!output)
53
+ return null;
54
+ let content = "";
55
+ if (output.stdout) {
56
+ content += stripAnsiColors(output.stdout);
57
+ }
58
+ if (output.stderr) {
59
+ content += (content ? "\n" : "") + stripAnsiColors(output.stderr);
60
+ }
61
+ const finalContent = content || "No output available";
62
+ const processedContent = finalContent.length > MAX_OUTPUT_LENGTH
63
+ ? finalContent.substring(0, MAX_OUTPUT_LENGTH) +
64
+ "\n\n... (output truncated)"
65
+ : finalContent;
66
+ return {
67
+ success: true,
68
+ content: processedContent,
69
+ shortResult: `${taskId}: ${output.status}`,
70
+ };
71
+ };
72
+ if (block) {
73
+ // Polling for completion
74
+ return new Promise((resolve) => {
75
+ let timeoutHandle = null;
76
+ let isAborted = false;
77
+ const cleanup = () => {
78
+ if (timeoutHandle) {
79
+ clearTimeout(timeoutHandle);
80
+ timeoutHandle = null;
81
+ }
82
+ };
83
+ const onAbort = () => {
84
+ isAborted = true;
85
+ cleanup();
86
+ resolve({
87
+ success: false,
88
+ content: "",
89
+ error: "Task output retrieval was aborted",
90
+ });
91
+ };
92
+ if (context.abortSignal) {
93
+ if (context.abortSignal.aborted) {
94
+ onAbort();
95
+ return;
96
+ }
97
+ context.abortSignal.addEventListener("abort", onAbort, {
98
+ once: true,
99
+ });
100
+ }
101
+ const check = () => {
102
+ if (isAborted)
103
+ return;
104
+ const task = backgroundTaskManager.getTask(taskId);
105
+ if (!task) {
106
+ if (context.abortSignal) {
107
+ context.abortSignal.removeEventListener("abort", onAbort);
108
+ }
109
+ resolve({
110
+ success: false,
111
+ content: "",
112
+ error: `Task with ID ${taskId} not found`,
113
+ });
114
+ return;
115
+ }
116
+ if (task.status !== "running") {
117
+ if (context.abortSignal) {
118
+ context.abortSignal.removeEventListener("abort", onAbort);
119
+ }
120
+ const result = getResult();
121
+ resolve(result || {
122
+ success: false,
123
+ content: "",
124
+ error: "Task not found",
125
+ });
126
+ }
127
+ else {
128
+ timeoutHandle = setTimeout(check, 500);
129
+ }
130
+ };
131
+ check();
132
+ });
133
+ }
134
+ const result = getResult();
135
+ if (!result) {
136
+ return {
137
+ success: false,
138
+ content: "",
139
+ error: `Task with ID ${taskId} not found`,
140
+ };
141
+ }
142
+ return result;
143
+ },
144
+ formatCompactParams: (params) => {
145
+ const taskId = params.task_id;
146
+ const block = params.block;
147
+ return `${taskId}${block ? " (blocking)" : ""}`;
148
+ },
149
+ };
@@ -0,0 +1,3 @@
1
+ import { ToolPlugin } from "./types.js";
2
+ export declare const taskStopTool: ToolPlugin;
3
+ //# sourceMappingURL=taskStopTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskStopTool.d.ts","sourceRoot":"","sources":["../../src/tools/taskStopTool.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,UAAU,EAAc,MAAM,YAAY,CAAC;AAEjE,eAAO,MAAM,YAAY,EAAE,UAoE1B,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { TASK_STOP_TOOL_NAME } from "../constants/tools.js";
2
+ export const taskStopTool = {
3
+ name: TASK_STOP_TOOL_NAME,
4
+ config: {
5
+ type: "function",
6
+ function: {
7
+ name: TASK_STOP_TOOL_NAME,
8
+ description: "Stops a running background task",
9
+ parameters: {
10
+ type: "object",
11
+ properties: {
12
+ task_id: {
13
+ type: "string",
14
+ description: "The ID of the background task to stop",
15
+ },
16
+ },
17
+ required: ["task_id"],
18
+ },
19
+ },
20
+ },
21
+ execute: async (args, context) => {
22
+ const taskId = args.task_id;
23
+ if (!taskId || typeof taskId !== "string") {
24
+ return {
25
+ success: false,
26
+ content: "",
27
+ error: "task_id parameter is required and must be a string",
28
+ };
29
+ }
30
+ const backgroundTaskManager = context?.backgroundTaskManager;
31
+ if (!backgroundTaskManager) {
32
+ return {
33
+ success: false,
34
+ content: "",
35
+ error: "Background task manager not available",
36
+ };
37
+ }
38
+ const stopped = backgroundTaskManager.stopTask(taskId);
39
+ if (stopped) {
40
+ return {
41
+ success: true,
42
+ content: `Task ${taskId} has been stopped`,
43
+ shortResult: `Stopped ${taskId}`,
44
+ };
45
+ }
46
+ else {
47
+ const task = backgroundTaskManager.getTask(taskId);
48
+ if (!task) {
49
+ return {
50
+ success: false,
51
+ content: "",
52
+ error: `Task with ID ${taskId} not found`,
53
+ };
54
+ }
55
+ return {
56
+ success: false,
57
+ content: "",
58
+ error: `Failed to stop task ${taskId} (status: ${task.status})`,
59
+ };
60
+ }
61
+ },
62
+ formatCompactParams: (params) => {
63
+ return params.task_id;
64
+ },
65
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"taskTool.d.ts","sourceRoot":"","sources":["../../src/tools/taskTool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGtE;;;GAGG;AACH,wBAAgB,cAAc,CAAC,eAAe,EAAE,eAAe,GAAG,UAAU,CAqI3E"}
1
+ {"version":3,"file":"taskTool.d.ts","sourceRoot":"","sources":["../../src/tools/taskTool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGtE;;;GAGG;AACH,wBAAgB,cAAc,CAAC,eAAe,EAAE,eAAe,GAAG,UAAU,CA6L3E"}