wave-agent-sdk 0.4.0 → 0.6.1

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 (190) hide show
  1. package/dist/agent.d.ts +42 -11
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +114 -115
  4. package/dist/constants/prompts.d.ts +18 -14
  5. package/dist/constants/prompts.d.ts.map +1 -1
  6. package/dist/constants/prompts.js +130 -54
  7. package/dist/constants/tools.d.ts +6 -3
  8. package/dist/constants/tools.d.ts.map +1 -1
  9. package/dist/constants/tools.js +6 -3
  10. package/dist/index.d.ts +1 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +1 -0
  13. package/dist/managers/MemoryRuleManager.js +1 -1
  14. package/dist/managers/aiManager.d.ts +5 -3
  15. package/dist/managers/aiManager.d.ts.map +1 -1
  16. package/dist/managers/aiManager.js +57 -20
  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 +255 -0
  22. package/dist/managers/foregroundTaskManager.d.ts +9 -0
  23. package/dist/managers/foregroundTaskManager.d.ts.map +1 -0
  24. package/dist/managers/foregroundTaskManager.js +21 -0
  25. package/dist/managers/liveConfigManager.d.ts +1 -1
  26. package/dist/managers/lspManager.d.ts.map +1 -1
  27. package/dist/managers/lspManager.js +3 -1
  28. package/dist/managers/mcpManager.d.ts.map +1 -1
  29. package/dist/managers/messageManager.d.ts +26 -12
  30. package/dist/managers/messageManager.d.ts.map +1 -1
  31. package/dist/managers/messageManager.js +138 -64
  32. package/dist/managers/permissionManager.d.ts.map +1 -1
  33. package/dist/managers/permissionManager.js +26 -22
  34. package/dist/managers/planManager.d.ts +1 -1
  35. package/dist/managers/planManager.d.ts.map +1 -1
  36. package/dist/managers/planManager.js +2 -2
  37. package/dist/managers/pluginManager.d.ts.map +1 -1
  38. package/dist/managers/pluginManager.js +3 -2
  39. package/dist/managers/slashCommandManager.d.ts +6 -0
  40. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  41. package/dist/managers/slashCommandManager.js +8 -2
  42. package/dist/managers/subagentManager.d.ts +15 -2
  43. package/dist/managers/subagentManager.d.ts.map +1 -1
  44. package/dist/managers/subagentManager.js +153 -39
  45. package/dist/managers/toolManager.d.ts +18 -1
  46. package/dist/managers/toolManager.d.ts.map +1 -1
  47. package/dist/managers/toolManager.js +29 -5
  48. package/dist/services/GitService.d.ts.map +1 -1
  49. package/dist/services/GitService.js +6 -2
  50. package/dist/services/MarketplaceService.d.ts +2 -2
  51. package/dist/services/MarketplaceService.d.ts.map +1 -1
  52. package/dist/services/MarketplaceService.js +18 -11
  53. package/dist/services/MemoryRuleService.d.ts +1 -1
  54. package/dist/services/MemoryRuleService.d.ts.map +1 -1
  55. package/dist/services/MemoryRuleService.js +13 -2
  56. package/dist/services/aiService.d.ts +0 -1
  57. package/dist/services/aiService.d.ts.map +1 -1
  58. package/dist/services/aiService.js +4 -140
  59. package/dist/services/memory.d.ts +0 -3
  60. package/dist/services/memory.d.ts.map +1 -1
  61. package/dist/services/memory.js +1 -60
  62. package/dist/services/session.d.ts +15 -1
  63. package/dist/services/session.d.ts.map +1 -1
  64. package/dist/services/session.js +57 -1
  65. package/dist/services/taskManager.d.ts +21 -0
  66. package/dist/services/taskManager.d.ts.map +1 -0
  67. package/dist/services/taskManager.js +158 -0
  68. package/dist/tools/askUserQuestion.d.ts.map +1 -1
  69. package/dist/tools/askUserQuestion.js +39 -25
  70. package/dist/tools/bashTool.d.ts +0 -8
  71. package/dist/tools/bashTool.d.ts.map +1 -1
  72. package/dist/tools/bashTool.js +48 -172
  73. package/dist/tools/editTool.d.ts.map +1 -1
  74. package/dist/tools/editTool.js +8 -6
  75. package/dist/tools/exitPlanMode.d.ts.map +1 -1
  76. package/dist/tools/exitPlanMode.js +25 -1
  77. package/dist/tools/globTool.d.ts.map +1 -1
  78. package/dist/tools/globTool.js +8 -2
  79. package/dist/tools/grepTool.d.ts.map +1 -1
  80. package/dist/tools/grepTool.js +17 -6
  81. package/dist/tools/lsTool.d.ts.map +1 -1
  82. package/dist/tools/lsTool.js +3 -1
  83. package/dist/tools/multiEditTool.d.ts.map +1 -1
  84. package/dist/tools/multiEditTool.js +7 -6
  85. package/dist/tools/readTool.d.ts.map +1 -1
  86. package/dist/tools/readTool.js +16 -1
  87. package/dist/tools/taskManagementTools.d.ts +6 -0
  88. package/dist/tools/taskManagementTools.d.ts.map +1 -0
  89. package/dist/tools/taskManagementTools.js +453 -0
  90. package/dist/tools/taskOutputTool.d.ts +3 -0
  91. package/dist/tools/taskOutputTool.d.ts.map +1 -0
  92. package/dist/tools/taskOutputTool.js +173 -0
  93. package/dist/tools/taskStopTool.d.ts +3 -0
  94. package/dist/tools/taskStopTool.d.ts.map +1 -0
  95. package/dist/tools/taskStopTool.js +71 -0
  96. package/dist/tools/taskTool.d.ts.map +1 -1
  97. package/dist/tools/taskTool.js +110 -63
  98. package/dist/tools/types.d.ts +12 -0
  99. package/dist/tools/types.d.ts.map +1 -1
  100. package/dist/tools/writeTool.d.ts.map +1 -1
  101. package/dist/tools/writeTool.js +9 -1
  102. package/dist/types/index.d.ts +1 -0
  103. package/dist/types/index.d.ts.map +1 -1
  104. package/dist/types/index.js +1 -0
  105. package/dist/types/marketplace.d.ts +1 -0
  106. package/dist/types/marketplace.d.ts.map +1 -1
  107. package/dist/types/messaging.d.ts +3 -8
  108. package/dist/types/messaging.d.ts.map +1 -1
  109. package/dist/types/processes.d.ts +29 -4
  110. package/dist/types/processes.d.ts.map +1 -1
  111. package/dist/types/tasks.d.ts +13 -0
  112. package/dist/types/tasks.d.ts.map +1 -0
  113. package/dist/types/tasks.js +1 -0
  114. package/dist/types/tools.d.ts +4 -1
  115. package/dist/types/tools.d.ts.map +1 -1
  116. package/dist/utils/builtinSubagents.d.ts.map +1 -1
  117. package/dist/utils/builtinSubagents.js +38 -1
  118. package/dist/utils/cacheControlUtils.d.ts.map +1 -1
  119. package/dist/utils/cacheControlUtils.js +18 -12
  120. package/dist/utils/constants.d.ts +0 -4
  121. package/dist/utils/constants.d.ts.map +1 -1
  122. package/dist/utils/constants.js +0 -4
  123. package/dist/utils/convertMessagesForAPI.js +2 -2
  124. package/dist/utils/editUtils.d.ts +2 -11
  125. package/dist/utils/editUtils.d.ts.map +1 -1
  126. package/dist/utils/editUtils.js +52 -79
  127. package/dist/utils/messageOperations.d.ts +5 -36
  128. package/dist/utils/messageOperations.d.ts.map +1 -1
  129. package/dist/utils/messageOperations.js +9 -98
  130. package/dist/utils/nameGenerator.d.ts +1 -1
  131. package/dist/utils/nameGenerator.d.ts.map +1 -1
  132. package/dist/utils/nameGenerator.js +19 -3
  133. package/package.json +5 -5
  134. package/src/agent.ts +157 -134
  135. package/src/constants/prompts.ts +156 -65
  136. package/src/constants/tools.ts +6 -3
  137. package/src/index.ts +1 -0
  138. package/src/managers/MemoryRuleManager.ts +1 -1
  139. package/src/managers/aiManager.ts +77 -35
  140. package/src/managers/backgroundBashManager.ts +1 -0
  141. package/src/managers/backgroundTaskManager.ts +305 -0
  142. package/src/managers/foregroundTaskManager.ts +27 -0
  143. package/src/managers/lspManager.ts +3 -1
  144. package/src/managers/mcpManager.ts +6 -3
  145. package/src/managers/messageManager.ts +185 -75
  146. package/src/managers/permissionManager.ts +33 -28
  147. package/src/managers/planManager.ts +2 -2
  148. package/src/managers/pluginManager.ts +4 -3
  149. package/src/managers/slashCommandManager.ts +15 -2
  150. package/src/managers/subagentManager.ts +194 -35
  151. package/src/managers/toolManager.ts +48 -6
  152. package/src/services/GitService.ts +6 -2
  153. package/src/services/MarketplaceService.ts +30 -12
  154. package/src/services/MemoryRuleService.ts +18 -6
  155. package/src/services/aiService.ts +3 -145
  156. package/src/services/memory.ts +1 -73
  157. package/src/services/session.ts +73 -0
  158. package/src/services/taskManager.ts +188 -0
  159. package/src/tools/askUserQuestion.ts +51 -29
  160. package/src/tools/bashTool.ts +63 -196
  161. package/src/tools/editTool.ts +9 -18
  162. package/src/tools/exitPlanMode.ts +26 -2
  163. package/src/tools/globTool.ts +10 -2
  164. package/src/tools/grepTool.ts +17 -6
  165. package/src/tools/lsTool.ts +3 -1
  166. package/src/tools/multiEditTool.ts +7 -18
  167. package/src/tools/readTool.ts +17 -1
  168. package/src/tools/taskManagementTools.ts +498 -0
  169. package/src/tools/taskOutputTool.ts +196 -0
  170. package/src/tools/taskStopTool.ts +78 -0
  171. package/src/tools/taskTool.ts +136 -74
  172. package/src/tools/types.ts +13 -0
  173. package/src/tools/writeTool.ts +9 -2
  174. package/src/types/index.ts +1 -0
  175. package/src/types/marketplace.ts +1 -0
  176. package/src/types/messaging.ts +2 -9
  177. package/src/types/processes.ts +39 -4
  178. package/src/types/tasks.ts +13 -0
  179. package/src/types/tools.ts +4 -1
  180. package/src/utils/builtinSubagents.ts +47 -1
  181. package/src/utils/cacheControlUtils.ts +26 -18
  182. package/src/utils/constants.ts +0 -5
  183. package/src/utils/convertMessagesForAPI.ts +2 -2
  184. package/src/utils/editUtils.ts +65 -103
  185. package/src/utils/messageOperations.ts +12 -136
  186. package/src/utils/nameGenerator.ts +20 -3
  187. package/dist/tools/todoWriteTool.d.ts +0 -6
  188. package/dist/tools/todoWriteTool.d.ts.map +0 -1
  189. package/dist/tools/todoWriteTool.js +0 -220
  190. package/src/tools/todoWriteTool.ts +0 -257
@@ -0,0 +1,305 @@
1
+ import { spawn, type ChildProcess } from "child_process";
2
+ import { BackgroundTask, BackgroundShell } from "../types/processes.js";
3
+ import { stripAnsiColors } from "../utils/stringUtils.js";
4
+ import { logger } from "../utils/globalLogger.js";
5
+
6
+ export interface BackgroundTaskManagerCallbacks {
7
+ onTasksChange?: (tasks: BackgroundTask[]) => void;
8
+ }
9
+
10
+ export interface BackgroundTaskManagerOptions {
11
+ callbacks?: BackgroundTaskManagerCallbacks;
12
+ workdir: string;
13
+ }
14
+
15
+ export class BackgroundTaskManager {
16
+ private tasks = new Map<string, BackgroundTask>();
17
+ private nextId = 1;
18
+ private callbacks: BackgroundTaskManagerCallbacks;
19
+ private workdir: string;
20
+
21
+ constructor(options: BackgroundTaskManagerOptions) {
22
+ this.callbacks = options.callbacks || {};
23
+ this.workdir = options.workdir;
24
+ }
25
+
26
+ private notifyTasksChange(): void {
27
+ this.callbacks.onTasksChange?.(Array.from(this.tasks.values()));
28
+ }
29
+
30
+ public generateId(): string {
31
+ return `task_${this.nextId++}`;
32
+ }
33
+
34
+ public addTask(task: BackgroundTask): void {
35
+ this.tasks.set(task.id, task);
36
+ this.notifyTasksChange();
37
+ }
38
+
39
+ public getTask(id: string): BackgroundTask | undefined {
40
+ return this.tasks.get(id);
41
+ }
42
+
43
+ public getAllTasks(): BackgroundTask[] {
44
+ return Array.from(this.tasks.values());
45
+ }
46
+
47
+ public startShell(
48
+ command: string,
49
+ timeout?: number,
50
+ ): { id: string; child: ChildProcess; detach: () => void } {
51
+ const id = this.generateId();
52
+ const startTime = Date.now();
53
+
54
+ const child = spawn(command, {
55
+ shell: true,
56
+ stdio: "pipe",
57
+ cwd: this.workdir,
58
+ env: {
59
+ ...process.env,
60
+ },
61
+ });
62
+
63
+ const shell: BackgroundShell = {
64
+ id,
65
+ type: "shell",
66
+ process: child,
67
+ command,
68
+ startTime,
69
+ status: "running",
70
+ stdout: "",
71
+ stderr: "",
72
+ onStop: () => {
73
+ try {
74
+ if (child.pid) {
75
+ process.kill(-child.pid, "SIGTERM");
76
+ setTimeout(() => {
77
+ if (child.pid && !child.killed) {
78
+ try {
79
+ process.kill(-child.pid, "SIGKILL");
80
+ } catch (error) {
81
+ logger.error("Failed to force kill process:", error);
82
+ }
83
+ }
84
+ }, 1000);
85
+ } else {
86
+ child.kill("SIGTERM");
87
+ }
88
+ } catch {
89
+ child.kill("SIGTERM");
90
+ }
91
+ },
92
+ };
93
+
94
+ this.tasks.set(id, shell);
95
+ this.notifyTasksChange();
96
+
97
+ // Set up timeout if specified
98
+ let timeoutHandle: NodeJS.Timeout | undefined;
99
+ if (timeout && timeout > 0) {
100
+ timeoutHandle = setTimeout(() => {
101
+ if (shell.status === "running") {
102
+ this.stopTask(id);
103
+ }
104
+ }, timeout);
105
+ }
106
+
107
+ const onStdout = (data: Buffer | string) => {
108
+ shell.stdout += stripAnsiColors(data.toString());
109
+ this.notifyTasksChange();
110
+ };
111
+
112
+ const onStderr = (data: Buffer | string) => {
113
+ shell.stderr += stripAnsiColors(data.toString());
114
+ this.notifyTasksChange();
115
+ };
116
+
117
+ const onExit = (code: number | null) => {
118
+ if (timeoutHandle) {
119
+ clearTimeout(timeoutHandle);
120
+ }
121
+ shell.status = code === 0 ? "completed" : "failed";
122
+ shell.exitCode = code ?? 0;
123
+ shell.endTime = Date.now();
124
+ shell.runtime = shell.endTime - startTime;
125
+ this.notifyTasksChange();
126
+ };
127
+
128
+ const onError = (error: Error) => {
129
+ if (timeoutHandle) {
130
+ clearTimeout(timeoutHandle);
131
+ }
132
+ shell.status = "failed";
133
+ shell.stderr += `\nProcess error: ${stripAnsiColors(error.message)}`;
134
+ shell.exitCode = 1;
135
+ shell.endTime = Date.now();
136
+ shell.runtime = shell.endTime - startTime;
137
+ this.notifyTasksChange();
138
+ };
139
+
140
+ child.stdout?.on("data", onStdout);
141
+ child.stderr?.on("data", onStderr);
142
+ child.on("exit", onExit);
143
+ child.on("error", onError);
144
+
145
+ const detach = () => {
146
+ child.stdout?.off("data", onStdout);
147
+ child.stderr?.off("data", onStderr);
148
+ child.off("exit", onExit);
149
+ child.off("error", onError);
150
+ if (timeoutHandle) {
151
+ clearTimeout(timeoutHandle);
152
+ }
153
+ this.tasks.delete(id);
154
+ this.notifyTasksChange();
155
+ };
156
+
157
+ return { id, child, detach };
158
+ }
159
+
160
+ public adoptProcess(
161
+ child: ChildProcess,
162
+ command: string,
163
+ initialStdout: string = "",
164
+ initialStderr: string = "",
165
+ ): string {
166
+ const id = this.generateId();
167
+ const startTime = Date.now();
168
+
169
+ const shell: BackgroundShell = {
170
+ id,
171
+ type: "shell",
172
+ process: child,
173
+ command,
174
+ startTime,
175
+ status: "running",
176
+ stdout: initialStdout,
177
+ stderr: initialStderr,
178
+ onStop: () => {
179
+ try {
180
+ if (child.pid) {
181
+ process.kill(-child.pid, "SIGTERM");
182
+ setTimeout(() => {
183
+ if (child.pid && !child.killed) {
184
+ try {
185
+ process.kill(-child.pid, "SIGKILL");
186
+ } catch (error) {
187
+ logger.error("Failed to force kill process:", error);
188
+ }
189
+ }
190
+ }, 1000);
191
+ } else {
192
+ child.kill("SIGTERM");
193
+ }
194
+ } catch {
195
+ child.kill("SIGTERM");
196
+ }
197
+ },
198
+ };
199
+
200
+ this.tasks.set(id, shell);
201
+ this.notifyTasksChange();
202
+
203
+ child.stdout?.on("data", (data) => {
204
+ shell.stdout += stripAnsiColors(data.toString());
205
+ this.notifyTasksChange();
206
+ });
207
+
208
+ child.stderr?.on("data", (data) => {
209
+ shell.stderr += stripAnsiColors(data.toString());
210
+ this.notifyTasksChange();
211
+ });
212
+
213
+ child.on("exit", (code) => {
214
+ shell.status = code === 0 ? "completed" : "failed";
215
+ shell.exitCode = code ?? 0;
216
+ shell.endTime = Date.now();
217
+ shell.runtime = shell.endTime - startTime;
218
+ this.notifyTasksChange();
219
+ });
220
+
221
+ child.on("error", (error) => {
222
+ shell.status = "failed";
223
+ shell.stderr += `\nProcess error: ${stripAnsiColors(error.message)}`;
224
+ shell.exitCode = 1;
225
+ shell.endTime = Date.now();
226
+ shell.runtime = shell.endTime - startTime;
227
+ this.notifyTasksChange();
228
+ });
229
+
230
+ return id;
231
+ }
232
+
233
+ public getOutput(
234
+ id: string,
235
+ filter?: string,
236
+ ): { stdout: string; stderr: string; status: string } | null {
237
+ const task = this.tasks.get(id);
238
+ if (!task) {
239
+ return null;
240
+ }
241
+
242
+ let stdout = task.stdout;
243
+ let stderr = task.stderr;
244
+
245
+ // Apply regex filter if provided
246
+ if (filter) {
247
+ try {
248
+ const regex = new RegExp(filter);
249
+ stdout = stdout
250
+ .split("\n")
251
+ .filter((line) => regex.test(line))
252
+ .join("\n");
253
+ stderr = stderr
254
+ .split("\n")
255
+ .filter((line) => regex.test(line))
256
+ .join("\n");
257
+ } catch (error) {
258
+ logger.warn(`Invalid filter regex: ${filter}`, error);
259
+ }
260
+ }
261
+
262
+ return {
263
+ stdout,
264
+ stderr,
265
+ status: task.status,
266
+ };
267
+ }
268
+
269
+ public stopTask(id: string): boolean {
270
+ const task = this.tasks.get(id);
271
+ if (!task || task.status !== "running") {
272
+ return false;
273
+ }
274
+
275
+ if (task.onStop) {
276
+ try {
277
+ const result = task.onStop();
278
+ if (result instanceof Promise) {
279
+ result.catch((error) => {
280
+ logger.error("Error in background task onStop callback:", error);
281
+ });
282
+ }
283
+ } catch (error) {
284
+ logger.error("Error in background task onStop callback:", error);
285
+ }
286
+ }
287
+
288
+ task.status = "killed";
289
+ task.endTime = Date.now();
290
+ task.runtime = task.endTime - task.startTime;
291
+ this.notifyTasksChange();
292
+ return true;
293
+ }
294
+
295
+ public cleanup(): void {
296
+ // Kill all running tasks
297
+ for (const [id, task] of this.tasks) {
298
+ if (task.status === "running") {
299
+ this.stopTask(id);
300
+ }
301
+ }
302
+ this.tasks.clear();
303
+ this.notifyTasksChange();
304
+ }
305
+ }
@@ -0,0 +1,27 @@
1
+ import { ForegroundTask, IForegroundTaskManager } from "../types/processes.js";
2
+
3
+ export class ForegroundTaskManager implements IForegroundTaskManager {
4
+ private activeForegroundTasks: ForegroundTask[] = [];
5
+
6
+ public registerForegroundTask(task: ForegroundTask): void {
7
+ this.activeForegroundTasks.push(task);
8
+ }
9
+
10
+ public unregisterForegroundTask(id: string): void {
11
+ this.activeForegroundTasks = this.activeForegroundTasks.filter(
12
+ (t) => t.id !== id,
13
+ );
14
+ }
15
+
16
+ public async backgroundCurrentTask(): Promise<void> {
17
+ const tasks = [...this.activeForegroundTasks].reverse();
18
+ this.activeForegroundTasks = [];
19
+ for (const task of tasks) {
20
+ await task.backgroundHandler();
21
+ }
22
+ }
23
+
24
+ public hasActiveTasks(): boolean {
25
+ return this.activeForegroundTasks.length > 0;
26
+ }
27
+ }
@@ -418,7 +418,9 @@ export class LspManager implements ILspManager {
418
418
  await this.sendRequest(lspProc, "shutdown", {}, timeout);
419
419
  await this.sendNotification(lspProc, "exit", {});
420
420
  // Give it a moment to exit
421
- await new Promise((resolve) => setTimeout(resolve, 100));
421
+ if (timeout > 100) {
422
+ await new Promise((resolve) => setTimeout(resolve, 100));
423
+ }
422
424
  } catch (error) {
423
425
  this.logger?.debug(
424
426
  `Failed to gracefully shutdown LSP for ${language}: ${error}`,
@@ -3,7 +3,7 @@ import { join } from "path";
3
3
  import { Client } from "@modelcontextprotocol/sdk/client/index.js";
4
4
  import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
5
5
  import { ChatCompletionFunctionTool } from "openai/resources.js";
6
- import { createMcpToolPlugin, findToolServer } from "@/utils/mcpUtils.js";
6
+ import { createMcpToolPlugin, findToolServer } from "../utils/mcpUtils.js";
7
7
  import type { ToolPlugin, ToolResult, ToolContext } from "../tools/types.js";
8
8
  import type {
9
9
  Logger,
@@ -476,8 +476,11 @@ export class McpManager {
476
476
  const server = findToolServer(tool.name, servers);
477
477
 
478
478
  if (server) {
479
- const plugin = createMcpToolPlugin(tool, server.name, (name, args) =>
480
- this.executeMcpTool(name, args),
479
+ const plugin = createMcpToolPlugin(
480
+ tool,
481
+ server.name,
482
+ (name: string, args: Record<string, unknown>) =>
483
+ this.executeMcpTool(name, args),
481
484
  );
482
485
  mcpTools.set(plugin.name, plugin);
483
486
  }