wave-agent-sdk 0.0.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 (170) hide show
  1. package/README.md +32 -0
  2. package/dist/agent.d.ts +96 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +286 -0
  5. package/dist/hooks/executor.d.ts +56 -0
  6. package/dist/hooks/executor.d.ts.map +1 -0
  7. package/dist/hooks/executor.js +312 -0
  8. package/dist/hooks/index.d.ts +17 -0
  9. package/dist/hooks/index.d.ts.map +1 -0
  10. package/dist/hooks/index.js +14 -0
  11. package/dist/hooks/manager.d.ts +90 -0
  12. package/dist/hooks/manager.d.ts.map +1 -0
  13. package/dist/hooks/manager.js +395 -0
  14. package/dist/hooks/matcher.d.ts +49 -0
  15. package/dist/hooks/matcher.d.ts.map +1 -0
  16. package/dist/hooks/matcher.js +147 -0
  17. package/dist/hooks/settings.d.ts +46 -0
  18. package/dist/hooks/settings.d.ts.map +1 -0
  19. package/dist/hooks/settings.js +100 -0
  20. package/dist/hooks/types.d.ts +80 -0
  21. package/dist/hooks/types.d.ts.map +1 -0
  22. package/dist/hooks/types.js +59 -0
  23. package/dist/index.d.ts +16 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +20 -0
  26. package/dist/managers/aiManager.d.ts +61 -0
  27. package/dist/managers/aiManager.d.ts.map +1 -0
  28. package/dist/managers/aiManager.js +415 -0
  29. package/dist/managers/backgroundBashManager.d.ts +27 -0
  30. package/dist/managers/backgroundBashManager.d.ts.map +1 -0
  31. package/dist/managers/backgroundBashManager.js +166 -0
  32. package/dist/managers/bashManager.d.ts +20 -0
  33. package/dist/managers/bashManager.d.ts.map +1 -0
  34. package/dist/managers/bashManager.js +66 -0
  35. package/dist/managers/mcpManager.d.ts +63 -0
  36. package/dist/managers/mcpManager.d.ts.map +1 -0
  37. package/dist/managers/mcpManager.js +378 -0
  38. package/dist/managers/messageManager.d.ts +85 -0
  39. package/dist/managers/messageManager.d.ts.map +1 -0
  40. package/dist/managers/messageManager.js +265 -0
  41. package/dist/managers/skillManager.d.ts +59 -0
  42. package/dist/managers/skillManager.d.ts.map +1 -0
  43. package/dist/managers/skillManager.js +317 -0
  44. package/dist/managers/slashCommandManager.d.ts +77 -0
  45. package/dist/managers/slashCommandManager.d.ts.map +1 -0
  46. package/dist/managers/slashCommandManager.js +208 -0
  47. package/dist/managers/toolManager.d.ts +23 -0
  48. package/dist/managers/toolManager.d.ts.map +1 -0
  49. package/dist/managers/toolManager.js +79 -0
  50. package/dist/services/aiService.d.ts +28 -0
  51. package/dist/services/aiService.d.ts.map +1 -0
  52. package/dist/services/aiService.js +180 -0
  53. package/dist/services/memory.d.ts +8 -0
  54. package/dist/services/memory.d.ts.map +1 -0
  55. package/dist/services/memory.js +128 -0
  56. package/dist/services/session.d.ts +54 -0
  57. package/dist/services/session.d.ts.map +1 -0
  58. package/dist/services/session.js +196 -0
  59. package/dist/tools/bashTool.d.ts +14 -0
  60. package/dist/tools/bashTool.d.ts.map +1 -0
  61. package/dist/tools/bashTool.js +351 -0
  62. package/dist/tools/deleteFileTool.d.ts +6 -0
  63. package/dist/tools/deleteFileTool.d.ts.map +1 -0
  64. package/dist/tools/deleteFileTool.js +67 -0
  65. package/dist/tools/editTool.d.ts +6 -0
  66. package/dist/tools/editTool.d.ts.map +1 -0
  67. package/dist/tools/editTool.js +168 -0
  68. package/dist/tools/globTool.d.ts +6 -0
  69. package/dist/tools/globTool.d.ts.map +1 -0
  70. package/dist/tools/globTool.js +113 -0
  71. package/dist/tools/grepTool.d.ts +6 -0
  72. package/dist/tools/grepTool.d.ts.map +1 -0
  73. package/dist/tools/grepTool.js +268 -0
  74. package/dist/tools/lsTool.d.ts +6 -0
  75. package/dist/tools/lsTool.d.ts.map +1 -0
  76. package/dist/tools/lsTool.js +160 -0
  77. package/dist/tools/multiEditTool.d.ts +6 -0
  78. package/dist/tools/multiEditTool.d.ts.map +1 -0
  79. package/dist/tools/multiEditTool.js +222 -0
  80. package/dist/tools/readTool.d.ts +6 -0
  81. package/dist/tools/readTool.d.ts.map +1 -0
  82. package/dist/tools/readTool.js +136 -0
  83. package/dist/tools/types.d.ts +35 -0
  84. package/dist/tools/types.d.ts.map +1 -0
  85. package/dist/tools/types.js +4 -0
  86. package/dist/tools/writeTool.d.ts +6 -0
  87. package/dist/tools/writeTool.d.ts.map +1 -0
  88. package/dist/tools/writeTool.js +138 -0
  89. package/dist/types.d.ts +212 -0
  90. package/dist/types.d.ts.map +1 -0
  91. package/dist/types.js +13 -0
  92. package/dist/utils/bashHistory.d.ts +46 -0
  93. package/dist/utils/bashHistory.d.ts.map +1 -0
  94. package/dist/utils/bashHistory.js +236 -0
  95. package/dist/utils/commandArgumentParser.d.ts +34 -0
  96. package/dist/utils/commandArgumentParser.d.ts.map +1 -0
  97. package/dist/utils/commandArgumentParser.js +123 -0
  98. package/dist/utils/constants.d.ts +27 -0
  99. package/dist/utils/constants.d.ts.map +1 -0
  100. package/dist/utils/constants.js +28 -0
  101. package/dist/utils/convertMessagesForAPI.d.ts +9 -0
  102. package/dist/utils/convertMessagesForAPI.d.ts.map +1 -0
  103. package/dist/utils/convertMessagesForAPI.js +189 -0
  104. package/dist/utils/customCommands.d.ts +14 -0
  105. package/dist/utils/customCommands.d.ts.map +1 -0
  106. package/dist/utils/customCommands.js +71 -0
  107. package/dist/utils/fileFilter.d.ts +26 -0
  108. package/dist/utils/fileFilter.d.ts.map +1 -0
  109. package/dist/utils/fileFilter.js +177 -0
  110. package/dist/utils/markdownParser.d.ts +27 -0
  111. package/dist/utils/markdownParser.d.ts.map +1 -0
  112. package/dist/utils/markdownParser.js +109 -0
  113. package/dist/utils/mcpUtils.d.ts +24 -0
  114. package/dist/utils/mcpUtils.d.ts.map +1 -0
  115. package/dist/utils/mcpUtils.js +51 -0
  116. package/dist/utils/messageOperations.d.ts +118 -0
  117. package/dist/utils/messageOperations.d.ts.map +1 -0
  118. package/dist/utils/messageOperations.js +334 -0
  119. package/dist/utils/path.d.ts +25 -0
  120. package/dist/utils/path.d.ts.map +1 -0
  121. package/dist/utils/path.js +109 -0
  122. package/dist/utils/skillParser.d.ts +18 -0
  123. package/dist/utils/skillParser.d.ts.map +1 -0
  124. package/dist/utils/skillParser.js +147 -0
  125. package/dist/utils/stringUtils.d.ts +13 -0
  126. package/dist/utils/stringUtils.d.ts.map +1 -0
  127. package/dist/utils/stringUtils.js +44 -0
  128. package/package.json +51 -0
  129. package/src/agent.ts +405 -0
  130. package/src/hooks/executor.ts +440 -0
  131. package/src/hooks/index.ts +52 -0
  132. package/src/hooks/manager.ts +618 -0
  133. package/src/hooks/matcher.ts +187 -0
  134. package/src/hooks/settings.ts +129 -0
  135. package/src/hooks/types.ts +169 -0
  136. package/src/index.ts +24 -0
  137. package/src/managers/aiManager.ts +573 -0
  138. package/src/managers/backgroundBashManager.ts +203 -0
  139. package/src/managers/bashManager.ts +97 -0
  140. package/src/managers/mcpManager.ts +493 -0
  141. package/src/managers/messageManager.ts +415 -0
  142. package/src/managers/skillManager.ts +404 -0
  143. package/src/managers/slashCommandManager.ts +293 -0
  144. package/src/managers/toolManager.ts +106 -0
  145. package/src/services/aiService.ts +252 -0
  146. package/src/services/memory.ts +149 -0
  147. package/src/services/session.ts +265 -0
  148. package/src/tools/bashTool.ts +402 -0
  149. package/src/tools/deleteFileTool.ts +81 -0
  150. package/src/tools/editTool.ts +192 -0
  151. package/src/tools/globTool.ts +135 -0
  152. package/src/tools/grepTool.ts +326 -0
  153. package/src/tools/lsTool.ts +187 -0
  154. package/src/tools/multiEditTool.ts +268 -0
  155. package/src/tools/readTool.ts +165 -0
  156. package/src/tools/types.ts +47 -0
  157. package/src/tools/writeTool.ts +163 -0
  158. package/src/types.ts +260 -0
  159. package/src/utils/bashHistory.ts +303 -0
  160. package/src/utils/commandArgumentParser.ts +153 -0
  161. package/src/utils/constants.ts +37 -0
  162. package/src/utils/convertMessagesForAPI.ts +236 -0
  163. package/src/utils/customCommands.ts +85 -0
  164. package/src/utils/fileFilter.ts +202 -0
  165. package/src/utils/markdownParser.ts +156 -0
  166. package/src/utils/mcpUtils.ts +81 -0
  167. package/src/utils/messageOperations.ts +506 -0
  168. package/src/utils/path.ts +118 -0
  169. package/src/utils/skillParser.ts +188 -0
  170. package/src/utils/stringUtils.ts +50 -0
@@ -0,0 +1,203 @@
1
+ import { spawn } from "child_process";
2
+ import type { BackgroundShell } from "../types.js";
3
+
4
+ export interface BackgroundBashManagerCallbacks {
5
+ onShellsChange?: (shells: BackgroundShell[]) => void;
6
+ }
7
+
8
+ export interface BackgroundBashManagerOptions {
9
+ callbacks?: BackgroundBashManagerCallbacks;
10
+ workdir: string;
11
+ }
12
+
13
+ export class BackgroundBashManager {
14
+ private shells = new Map<string, BackgroundShell>();
15
+ private nextId = 1;
16
+ private callbacks: BackgroundBashManagerCallbacks;
17
+ private workdir: string;
18
+
19
+ constructor(options: BackgroundBashManagerOptions) {
20
+ this.callbacks = options.callbacks || {};
21
+ this.workdir = options.workdir;
22
+ }
23
+
24
+ private notifyShellsChange(): void {
25
+ this.callbacks.onShellsChange?.(Array.from(this.shells.values()));
26
+ }
27
+
28
+ public startShell(command: string, timeout?: number): string {
29
+ const id = `bash_${this.nextId++}`;
30
+ const startTime = Date.now();
31
+
32
+ const child = spawn(command, {
33
+ shell: true,
34
+ stdio: "pipe",
35
+ cwd: this.workdir,
36
+ env: {
37
+ ...process.env,
38
+ },
39
+ });
40
+
41
+ const shell: BackgroundShell = {
42
+ id,
43
+ process: child,
44
+ command,
45
+ startTime,
46
+ status: "running",
47
+ stdout: "",
48
+ stderr: "",
49
+ };
50
+
51
+ this.shells.set(id, shell);
52
+ this.notifyShellsChange();
53
+
54
+ // Set up timeout if specified
55
+ let timeoutHandle: NodeJS.Timeout | undefined;
56
+ if (timeout && timeout > 0) {
57
+ timeoutHandle = setTimeout(() => {
58
+ if (shell.status === "running") {
59
+ this.killShell(id);
60
+ }
61
+ }, timeout);
62
+ }
63
+
64
+ child.stdout?.on("data", (data) => {
65
+ shell.stdout += data.toString();
66
+ this.notifyShellsChange();
67
+ });
68
+
69
+ child.stderr?.on("data", (data) => {
70
+ shell.stderr += data.toString();
71
+ this.notifyShellsChange();
72
+ });
73
+
74
+ child.on("exit", (code) => {
75
+ if (timeoutHandle) {
76
+ clearTimeout(timeoutHandle);
77
+ }
78
+ shell.status = "completed";
79
+ shell.exitCode = code ?? 0;
80
+ shell.runtime = Date.now() - startTime;
81
+ this.notifyShellsChange();
82
+ });
83
+
84
+ child.on("error", (error) => {
85
+ if (timeoutHandle) {
86
+ clearTimeout(timeoutHandle);
87
+ }
88
+ shell.status = "completed";
89
+ shell.stderr += `\nProcess error: ${error.message}`;
90
+ shell.exitCode = 1;
91
+ shell.runtime = Date.now() - startTime;
92
+ this.notifyShellsChange();
93
+ });
94
+
95
+ return id;
96
+ }
97
+
98
+ public getShell(id: string): BackgroundShell | undefined {
99
+ return this.shells.get(id);
100
+ }
101
+
102
+ public getAllShells(): BackgroundShell[] {
103
+ return Array.from(this.shells.values());
104
+ }
105
+
106
+ public getOutput(
107
+ id: string,
108
+ filter?: string,
109
+ ): { stdout: string; stderr: string; status: string } | null {
110
+ const shell = this.shells.get(id);
111
+ if (!shell) {
112
+ return null;
113
+ }
114
+
115
+ let stdout = shell.stdout;
116
+ let stderr = shell.stderr;
117
+
118
+ // Apply regex filter if provided
119
+ if (filter) {
120
+ try {
121
+ const regex = new RegExp(filter);
122
+ stdout = stdout
123
+ .split("\n")
124
+ .filter((line) => regex.test(line))
125
+ .join("\n");
126
+ stderr = stderr
127
+ .split("\n")
128
+ .filter((line) => regex.test(line))
129
+ .join("\n");
130
+ } catch {
131
+ // logger.warn(`Invalid filter regex: ${filter}`, error);
132
+ }
133
+ }
134
+
135
+ return {
136
+ stdout,
137
+ stderr,
138
+ status: shell.status,
139
+ };
140
+ }
141
+
142
+ public killShell(id: string): boolean {
143
+ const shell = this.shells.get(id);
144
+ if (!shell || shell.status !== "running") {
145
+ return false;
146
+ }
147
+
148
+ try {
149
+ // Try to kill process group first
150
+ if (shell.process.pid) {
151
+ process.kill(-shell.process.pid, "SIGTERM");
152
+
153
+ // Force kill after timeout
154
+ setTimeout(() => {
155
+ if (
156
+ shell.status === "running" &&
157
+ shell.process.pid &&
158
+ !shell.process.killed
159
+ ) {
160
+ try {
161
+ process.kill(-shell.process.pid, "SIGKILL");
162
+ } catch {
163
+ // logger.error("Failed to force kill process:", error);
164
+ }
165
+ }
166
+ }, 1000);
167
+ }
168
+
169
+ shell.status = "killed";
170
+ shell.runtime = Date.now() - shell.startTime;
171
+ this.notifyShellsChange();
172
+ return true;
173
+ } catch {
174
+ // Fallback to direct process kill
175
+ try {
176
+ shell.process.kill("SIGTERM");
177
+ setTimeout(() => {
178
+ if (!shell.process.killed) {
179
+ shell.process.kill("SIGKILL");
180
+ }
181
+ }, 1000);
182
+ shell.status = "killed";
183
+ shell.runtime = Date.now() - shell.startTime;
184
+ this.notifyShellsChange();
185
+ return true;
186
+ } catch {
187
+ // logger.error("Failed to kill child process:", directKillError);
188
+ return false;
189
+ }
190
+ }
191
+ }
192
+
193
+ public cleanup(): void {
194
+ // Kill all running shells
195
+ for (const [id, shell] of this.shells) {
196
+ if (shell.status === "running") {
197
+ this.killShell(id);
198
+ }
199
+ }
200
+ this.shells.clear();
201
+ this.notifyShellsChange();
202
+ }
203
+ }
@@ -0,0 +1,97 @@
1
+ import { spawn, type ChildProcess } from "child_process";
2
+ import { addBashCommandToHistory } from "../utils/bashHistory.js";
3
+ import type { MessageManager } from "./messageManager.js";
4
+
5
+ export interface BashManagerOptions {
6
+ messageManager: MessageManager;
7
+ workdir: string;
8
+ }
9
+
10
+ export interface CommandExecutionResult {
11
+ exitCode: number;
12
+ output: string;
13
+ }
14
+
15
+ export class BashManager {
16
+ private workdir: string;
17
+ private messageManager: MessageManager;
18
+ public isCommandRunning = false;
19
+ private currentProcess: ChildProcess | null = null;
20
+
21
+ constructor(options: BashManagerOptions) {
22
+ this.workdir = options.workdir;
23
+ this.messageManager = options.messageManager;
24
+ }
25
+
26
+ private setCommandRunning(isRunning: boolean): void {
27
+ this.isCommandRunning = isRunning;
28
+ }
29
+
30
+ public async executeCommand(command: string): Promise<number> {
31
+ if (this.isCommandRunning) {
32
+ throw new Error("Command already running");
33
+ }
34
+
35
+ this.setCommandRunning(true);
36
+
37
+ // Add command output placeholder
38
+ this.messageManager.addCommandOutputMessage(command);
39
+
40
+ return new Promise<number>((resolve) => {
41
+ const child = spawn(command, {
42
+ shell: true,
43
+ stdio: "pipe",
44
+ cwd: this.workdir,
45
+ env: {
46
+ ...process.env,
47
+ },
48
+ });
49
+
50
+ this.currentProcess = child;
51
+ let outputBuffer = "";
52
+
53
+ const updateOutput = (newData: string) => {
54
+ outputBuffer += newData;
55
+ this.messageManager.updateCommandOutputMessage(command, outputBuffer);
56
+ };
57
+
58
+ child.stdout?.on("data", (data) => {
59
+ updateOutput(data.toString());
60
+ });
61
+
62
+ child.stderr?.on("data", (data) => {
63
+ updateOutput(data.toString());
64
+ });
65
+
66
+ child.on("exit", (code, signal) => {
67
+ const exitCode = code === null && signal ? 130 : (code ?? 0);
68
+
69
+ // Add command to bash history
70
+ addBashCommandToHistory(command, this.workdir);
71
+
72
+ this.messageManager.completeCommandMessage(command, exitCode);
73
+
74
+ this.setCommandRunning(false);
75
+ this.currentProcess = null;
76
+ resolve(exitCode);
77
+ });
78
+
79
+ child.on("error", (error) => {
80
+ updateOutput(`\nError: ${error.message}\n`);
81
+ this.messageManager.completeCommandMessage(command, 1);
82
+
83
+ this.setCommandRunning(false);
84
+ this.currentProcess = null;
85
+ resolve(1);
86
+ });
87
+ });
88
+ }
89
+
90
+ public abortCommand(): void {
91
+ if (this.currentProcess && this.isCommandRunning) {
92
+ this.currentProcess.kill("SIGKILL");
93
+ this.currentProcess = null;
94
+ this.isCommandRunning = false;
95
+ }
96
+ }
97
+ }