wave-agent-sdk 0.0.8 → 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.
Files changed (236) hide show
  1. package/dist/agent.d.ts +92 -23
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +340 -137
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +2 -0
  7. package/dist/managers/aiManager.d.ts +14 -36
  8. package/dist/managers/aiManager.d.ts.map +1 -1
  9. package/dist/managers/aiManager.js +74 -77
  10. package/dist/managers/backgroundBashManager.d.ts.map +1 -1
  11. package/dist/managers/backgroundBashManager.js +4 -3
  12. package/dist/managers/hookManager.d.ts +3 -8
  13. package/dist/managers/hookManager.d.ts.map +1 -1
  14. package/dist/managers/hookManager.js +39 -29
  15. package/dist/managers/liveConfigManager.d.ts +55 -18
  16. package/dist/managers/liveConfigManager.d.ts.map +1 -1
  17. package/dist/managers/liveConfigManager.js +372 -90
  18. package/dist/managers/lspManager.d.ts +43 -0
  19. package/dist/managers/lspManager.d.ts.map +1 -0
  20. package/dist/managers/lspManager.js +326 -0
  21. package/dist/managers/messageManager.d.ts +8 -16
  22. package/dist/managers/messageManager.d.ts.map +1 -1
  23. package/dist/managers/messageManager.js +52 -74
  24. package/dist/managers/permissionManager.d.ts +66 -0
  25. package/dist/managers/permissionManager.d.ts.map +1 -0
  26. package/dist/managers/permissionManager.js +208 -0
  27. package/dist/managers/skillManager.d.ts +1 -0
  28. package/dist/managers/skillManager.d.ts.map +1 -1
  29. package/dist/managers/skillManager.js +2 -1
  30. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  31. package/dist/managers/slashCommandManager.js +0 -1
  32. package/dist/managers/subagentManager.d.ts +8 -23
  33. package/dist/managers/subagentManager.d.ts.map +1 -1
  34. package/dist/managers/subagentManager.js +97 -117
  35. package/dist/managers/toolManager.d.ts +38 -1
  36. package/dist/managers/toolManager.d.ts.map +1 -1
  37. package/dist/managers/toolManager.js +66 -2
  38. package/dist/services/aiService.d.ts +3 -1
  39. package/dist/services/aiService.d.ts.map +1 -1
  40. package/dist/services/aiService.js +123 -30
  41. package/dist/services/configurationService.d.ts +116 -0
  42. package/dist/services/configurationService.d.ts.map +1 -0
  43. package/dist/services/configurationService.js +585 -0
  44. package/dist/services/fileWatcher.d.ts.map +1 -1
  45. package/dist/services/fileWatcher.js +5 -6
  46. package/dist/services/hook.d.ts +7 -124
  47. package/dist/services/hook.d.ts.map +1 -1
  48. package/dist/services/hook.js +46 -458
  49. package/dist/services/jsonlHandler.d.ts +24 -15
  50. package/dist/services/jsonlHandler.d.ts.map +1 -1
  51. package/dist/services/jsonlHandler.js +67 -88
  52. package/dist/services/memory.d.ts +0 -9
  53. package/dist/services/memory.d.ts.map +1 -1
  54. package/dist/services/memory.js +2 -49
  55. package/dist/services/session.d.ts +82 -33
  56. package/dist/services/session.d.ts.map +1 -1
  57. package/dist/services/session.js +275 -181
  58. package/dist/tools/bashTool.d.ts.map +1 -1
  59. package/dist/tools/bashTool.js +72 -13
  60. package/dist/tools/deleteFileTool.d.ts.map +1 -1
  61. package/dist/tools/deleteFileTool.js +25 -0
  62. package/dist/tools/editTool.d.ts.map +1 -1
  63. package/dist/tools/editTool.js +30 -6
  64. package/dist/tools/lspTool.d.ts +6 -0
  65. package/dist/tools/lspTool.d.ts.map +1 -0
  66. package/dist/tools/lspTool.js +589 -0
  67. package/dist/tools/multiEditTool.d.ts.map +1 -1
  68. package/dist/tools/multiEditTool.js +26 -7
  69. package/dist/tools/readTool.d.ts.map +1 -1
  70. package/dist/tools/readTool.js +111 -2
  71. package/dist/tools/skillTool.js +2 -2
  72. package/dist/tools/todoWriteTool.d.ts.map +1 -1
  73. package/dist/tools/todoWriteTool.js +23 -0
  74. package/dist/tools/types.d.ts +11 -8
  75. package/dist/tools/types.d.ts.map +1 -1
  76. package/dist/tools/writeTool.d.ts.map +1 -1
  77. package/dist/tools/writeTool.js +25 -9
  78. package/dist/types/commands.d.ts +0 -1
  79. package/dist/types/commands.d.ts.map +1 -1
  80. package/dist/types/config.d.ts +4 -0
  81. package/dist/types/config.d.ts.map +1 -1
  82. package/dist/types/configuration.d.ts +69 -0
  83. package/dist/types/configuration.d.ts.map +1 -0
  84. package/dist/types/configuration.js +8 -0
  85. package/dist/types/core.d.ts +10 -0
  86. package/dist/types/core.d.ts.map +1 -1
  87. package/dist/types/environment.d.ts +41 -0
  88. package/dist/types/environment.d.ts.map +1 -1
  89. package/dist/types/fileSearch.d.ts +5 -0
  90. package/dist/types/fileSearch.d.ts.map +1 -0
  91. package/dist/types/fileSearch.js +1 -0
  92. package/dist/types/hooks.d.ts +11 -2
  93. package/dist/types/hooks.d.ts.map +1 -1
  94. package/dist/types/hooks.js +1 -7
  95. package/dist/types/index.d.ts +5 -0
  96. package/dist/types/index.d.ts.map +1 -1
  97. package/dist/types/index.js +5 -0
  98. package/dist/types/lsp.d.ts +90 -0
  99. package/dist/types/lsp.d.ts.map +1 -0
  100. package/dist/types/lsp.js +4 -0
  101. package/dist/types/messaging.d.ts +6 -11
  102. package/dist/types/messaging.d.ts.map +1 -1
  103. package/dist/types/permissions.d.ts +35 -0
  104. package/dist/types/permissions.d.ts.map +1 -0
  105. package/dist/types/permissions.js +12 -0
  106. package/dist/types/session.d.ts +1 -6
  107. package/dist/types/session.d.ts.map +1 -1
  108. package/dist/types/skills.d.ts +1 -0
  109. package/dist/types/skills.d.ts.map +1 -1
  110. package/dist/types/tools.d.ts +35 -0
  111. package/dist/types/tools.d.ts.map +1 -0
  112. package/dist/types/tools.js +4 -0
  113. package/dist/utils/abortUtils.d.ts +34 -0
  114. package/dist/utils/abortUtils.d.ts.map +1 -0
  115. package/dist/utils/abortUtils.js +92 -0
  116. package/dist/utils/bashHistory.d.ts +4 -0
  117. package/dist/utils/bashHistory.d.ts.map +1 -1
  118. package/dist/utils/bashHistory.js +21 -4
  119. package/dist/utils/builtinSubagents.d.ts +7 -0
  120. package/dist/utils/builtinSubagents.d.ts.map +1 -0
  121. package/dist/utils/builtinSubagents.js +65 -0
  122. package/dist/utils/cacheControlUtils.d.ts +8 -33
  123. package/dist/utils/cacheControlUtils.d.ts.map +1 -1
  124. package/dist/utils/cacheControlUtils.js +83 -126
  125. package/dist/utils/constants.d.ts +0 -12
  126. package/dist/utils/constants.d.ts.map +1 -1
  127. package/dist/utils/constants.js +1 -13
  128. package/dist/utils/convertMessagesForAPI.d.ts +2 -1
  129. package/dist/utils/convertMessagesForAPI.d.ts.map +1 -1
  130. package/dist/utils/convertMessagesForAPI.js +33 -14
  131. package/dist/utils/fileSearch.d.ts +14 -0
  132. package/dist/utils/fileSearch.d.ts.map +1 -0
  133. package/dist/utils/fileSearch.js +88 -0
  134. package/dist/utils/fileUtils.d.ts +14 -2
  135. package/dist/utils/fileUtils.d.ts.map +1 -1
  136. package/dist/utils/fileUtils.js +101 -17
  137. package/dist/utils/globalLogger.d.ts +0 -14
  138. package/dist/utils/globalLogger.d.ts.map +1 -1
  139. package/dist/utils/globalLogger.js +0 -16
  140. package/dist/utils/largeOutputHandler.d.ts +15 -0
  141. package/dist/utils/largeOutputHandler.d.ts.map +1 -0
  142. package/dist/utils/largeOutputHandler.js +40 -0
  143. package/dist/utils/markdownParser.d.ts.map +1 -1
  144. package/dist/utils/markdownParser.js +1 -17
  145. package/dist/utils/messageOperations.d.ts +1 -11
  146. package/dist/utils/messageOperations.d.ts.map +1 -1
  147. package/dist/utils/messageOperations.js +7 -24
  148. package/dist/utils/pathEncoder.d.ts +4 -0
  149. package/dist/utils/pathEncoder.d.ts.map +1 -1
  150. package/dist/utils/pathEncoder.js +16 -9
  151. package/dist/utils/subagentParser.d.ts +2 -2
  152. package/dist/utils/subagentParser.d.ts.map +1 -1
  153. package/dist/utils/subagentParser.js +10 -7
  154. package/dist/utils/tokenEstimator.d.ts +39 -0
  155. package/dist/utils/tokenEstimator.d.ts.map +1 -0
  156. package/dist/utils/tokenEstimator.js +55 -0
  157. package/package.json +5 -8
  158. package/src/agent.ts +460 -216
  159. package/src/index.ts +2 -0
  160. package/src/managers/aiManager.ts +107 -111
  161. package/src/managers/backgroundBashManager.ts +4 -3
  162. package/src/managers/hookManager.ts +44 -39
  163. package/src/managers/liveConfigManager.ts +524 -138
  164. package/src/managers/lspManager.ts +434 -0
  165. package/src/managers/messageManager.ts +73 -103
  166. package/src/managers/permissionManager.ts +276 -0
  167. package/src/managers/skillManager.ts +3 -1
  168. package/src/managers/slashCommandManager.ts +1 -2
  169. package/src/managers/subagentManager.ts +116 -159
  170. package/src/managers/toolManager.ts +95 -3
  171. package/src/services/aiService.ts +207 -26
  172. package/src/services/configurationService.ts +762 -0
  173. package/src/services/fileWatcher.ts +5 -6
  174. package/src/services/hook.ts +50 -631
  175. package/src/services/jsonlHandler.ts +84 -100
  176. package/src/services/memory.ts +2 -59
  177. package/src/services/session.ts +338 -213
  178. package/src/tools/bashTool.ts +89 -16
  179. package/src/tools/deleteFileTool.ts +36 -0
  180. package/src/tools/editTool.ts +41 -7
  181. package/src/tools/lspTool.ts +760 -0
  182. package/src/tools/multiEditTool.ts +37 -8
  183. package/src/tools/readTool.ts +125 -2
  184. package/src/tools/skillTool.ts +2 -2
  185. package/src/tools/todoWriteTool.ts +33 -1
  186. package/src/tools/types.ts +15 -9
  187. package/src/tools/writeTool.ts +36 -10
  188. package/src/types/commands.ts +0 -1
  189. package/src/types/config.ts +5 -0
  190. package/src/types/configuration.ts +73 -0
  191. package/src/types/core.ts +11 -0
  192. package/src/types/environment.ts +44 -0
  193. package/src/types/fileSearch.ts +4 -0
  194. package/src/types/hooks.ts +14 -11
  195. package/src/types/index.ts +5 -0
  196. package/src/types/lsp.ts +96 -0
  197. package/src/types/messaging.ts +8 -13
  198. package/src/types/permissions.ts +48 -0
  199. package/src/types/session.ts +3 -8
  200. package/src/types/skills.ts +1 -0
  201. package/src/types/tools.ts +38 -0
  202. package/src/utils/abortUtils.ts +118 -0
  203. package/src/utils/bashHistory.ts +28 -4
  204. package/src/utils/builtinSubagents.ts +71 -0
  205. package/src/utils/cacheControlUtils.ts +106 -171
  206. package/src/utils/constants.ts +1 -16
  207. package/src/utils/convertMessagesForAPI.ts +38 -14
  208. package/src/utils/fileSearch.ts +107 -0
  209. package/src/utils/fileUtils.ts +114 -19
  210. package/src/utils/globalLogger.ts +0 -17
  211. package/src/utils/largeOutputHandler.ts +55 -0
  212. package/src/utils/markdownParser.ts +1 -19
  213. package/src/utils/messageOperations.ts +7 -35
  214. package/src/utils/pathEncoder.ts +24 -9
  215. package/src/utils/subagentParser.ts +11 -8
  216. package/src/utils/tokenEstimator.ts +68 -0
  217. package/dist/constants/events.d.ts +0 -28
  218. package/dist/constants/events.d.ts.map +0 -1
  219. package/dist/constants/events.js +0 -27
  220. package/dist/services/configurationWatcher.d.ts +0 -120
  221. package/dist/services/configurationWatcher.d.ts.map +0 -1
  222. package/dist/services/configurationWatcher.js +0 -439
  223. package/dist/services/memoryStore.d.ts +0 -81
  224. package/dist/services/memoryStore.d.ts.map +0 -1
  225. package/dist/services/memoryStore.js +0 -200
  226. package/dist/types/memoryStore.d.ts +0 -82
  227. package/dist/types/memoryStore.d.ts.map +0 -1
  228. package/dist/types/memoryStore.js +0 -7
  229. package/dist/utils/configResolver.d.ts +0 -65
  230. package/dist/utils/configResolver.d.ts.map +0 -1
  231. package/dist/utils/configResolver.js +0 -210
  232. package/src/constants/events.ts +0 -38
  233. package/src/services/configurationWatcher.ts +0 -622
  234. package/src/services/memoryStore.ts +0 -279
  235. package/src/types/memoryStore.ts +0 -94
  236. package/src/utils/configResolver.ts +0 -302
@@ -1,5 +1,7 @@
1
1
  import { spawn, ChildProcess } from "child_process";
2
2
  import { logger } from "../utils/globalLogger.js";
3
+ import { stripAnsiColors } from "../utils/stringUtils.js";
4
+ import { handleLargeOutput } from "../utils/largeOutputHandler.js";
3
5
  import type { ToolPlugin, ToolResult, ToolContext } from "./types.js";
4
6
 
5
7
  /**
@@ -45,6 +47,7 @@ export const bashTool: ToolPlugin = {
45
47
  ): Promise<ToolResult> => {
46
48
  const command = args.command as string;
47
49
  const runInBackground = args.run_in_background as boolean | undefined;
50
+ const description = args.description as string | undefined;
48
51
  // Set default timeout: 60s for foreground, no timeout for background
49
52
  const timeout =
50
53
  (args.timeout as number | undefined) ??
@@ -70,6 +73,45 @@ export const bashTool: ToolPlugin = {
70
73
  };
71
74
  }
72
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
+
73
115
  if (runInBackground) {
74
116
  // Background execution
75
117
  const backgroundBashManager = context?.backgroundBashManager;
@@ -168,18 +210,21 @@ export const bashTool: ToolPlugin = {
168
210
  handleAbort();
169
211
  return;
170
212
  }
171
- context.abortSignal.addEventListener("abort", () => handleAbort());
213
+ // Use { once: true } to prevent listener accumulation on signal reuse
214
+ context.abortSignal.addEventListener("abort", () => handleAbort(), {
215
+ once: true,
216
+ });
172
217
  }
173
218
 
174
219
  child.stdout?.on("data", (data) => {
175
220
  if (!isAborted) {
176
- outputBuffer += data.toString();
221
+ outputBuffer += stripAnsiColors(data.toString());
177
222
  }
178
223
  });
179
224
 
180
225
  child.stderr?.on("data", (data) => {
181
226
  if (!isAborted) {
182
- errorBuffer += data.toString();
227
+ errorBuffer += stripAnsiColors(data.toString());
183
228
  }
184
229
  });
185
230
 
@@ -193,15 +238,32 @@ export const bashTool: ToolPlugin = {
193
238
  const combinedOutput =
194
239
  outputBuffer + (errorBuffer ? "\n" + errorBuffer : "");
195
240
 
196
- resolve({
197
- success: exitCode === 0,
198
- content:
199
- combinedOutput || `Command executed with exit code: ${exitCode}`,
200
- error:
201
- exitCode !== 0
202
- ? `Command failed with exit code: ${exitCode}`
203
- : undefined,
204
- });
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
+ });
205
267
  }
206
268
  });
207
269
 
@@ -220,9 +282,15 @@ export const bashTool: ToolPlugin = {
220
282
  });
221
283
  },
222
284
  formatCompactParams: (params: Record<string, unknown>) => {
285
+ const description = params.description as string;
223
286
  const command = params.command as string;
224
287
  const runInBackground = params.run_in_background as boolean;
225
- return `${command}${runInBackground ? " background" : ""}`;
288
+
289
+ if (description) {
290
+ return description;
291
+ }
292
+
293
+ return `${command}${runInBackground ? " (background)" : ""}`;
226
294
  },
227
295
  };
228
296
 
@@ -299,15 +367,20 @@ export const bashOutputTool: ToolPlugin = {
299
367
 
300
368
  let content = "";
301
369
  if (output.stdout) {
302
- content += output.stdout;
370
+ content += stripAnsiColors(output.stdout);
303
371
  }
304
372
  if (output.stderr) {
305
- content += (content ? "\n" : "") + output.stderr;
373
+ content += (content ? "\n" : "") + stripAnsiColors(output.stderr);
306
374
  }
307
375
 
376
+ const finalContent = content || "No output available";
377
+ const { content: processedContent, filePath } =
378
+ await handleLargeOutput(finalContent);
379
+
308
380
  return {
309
381
  success: true,
310
- content: content || "No output available",
382
+ content: processedContent,
383
+ filePath,
311
384
  shortResult: `${bashId}: ${output.status}${shell.exitCode !== undefined ? ` (${shell.exitCode})` : ""}`,
312
385
  error: undefined,
313
386
  };
@@ -46,6 +46,42 @@ export const deleteFileTool: ToolPlugin = {
46
46
  try {
47
47
  const filePath = resolvePath(targetFile, context.workdir);
48
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
+
49
85
  // Delete file
50
86
  await unlink(filePath);
51
87
 
@@ -2,7 +2,6 @@ import { readFile, writeFile } from "fs/promises";
2
2
  import { logger } from "../utils/globalLogger.js";
3
3
  import type { ToolPlugin, ToolResult, ToolContext } from "./types.js";
4
4
  import { resolvePath, getDisplayPath } from "../utils/path.js";
5
- import { diffLines } from "diff";
6
5
 
7
6
  /**
8
7
  * Format compact parameter display
@@ -143,6 +142,47 @@ export const editTool: ToolPlugin = {
143
142
  replacementCount = 1;
144
143
  }
145
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
+
146
186
  // Write file
147
187
  try {
148
188
  await writeFile(resolvedPath, newContent, "utf-8");
@@ -154,9 +194,6 @@ export const editTool: ToolPlugin = {
154
194
  };
155
195
  }
156
196
 
157
- // Generate diff information
158
- const diffResult = diffLines(originalContent, newContent);
159
-
160
197
  const shortResult = replaceAll
161
198
  ? `Replaced ${replacementCount} instances`
162
199
  : "Text replaced successfully";
@@ -168,9 +205,6 @@ export const editTool: ToolPlugin = {
168
205
  content: shortResult,
169
206
  shortResult,
170
207
  filePath: resolvedPath,
171
- originalContent,
172
- newContent,
173
- diffResult,
174
208
  };
175
209
  } catch (error) {
176
210
  const errorMessage =