wave-agent-sdk 0.9.6 → 0.10.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.
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/managers/backgroundTaskManager.d.ts.map +1 -1
- package/dist/managers/backgroundTaskManager.js +59 -6
- package/dist/managers/messageManager.d.ts +5 -1
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +11 -1
- package/dist/managers/pluginManager.js +1 -1
- package/dist/managers/skillManager.d.ts +17 -3
- package/dist/managers/skillManager.d.ts.map +1 -1
- package/dist/managers/skillManager.js +64 -26
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +28 -10
- package/dist/managers/subagentManager.d.ts +2 -0
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +22 -0
- package/dist/services/MarketplaceService.d.ts.map +1 -1
- package/dist/services/MarketplaceService.js +4 -0
- package/dist/services/hook.d.ts.map +1 -1
- package/dist/services/hook.js +15 -2
- package/dist/tools/agentTool.d.ts.map +1 -1
- package/dist/tools/agentTool.js +7 -3
- package/dist/tools/bashTool.d.ts.map +1 -1
- package/dist/tools/bashTool.js +6 -2
- package/dist/tools/globTool.d.ts.map +1 -1
- package/dist/tools/globTool.js +9 -48
- package/dist/tools/grepTool.d.ts.map +1 -1
- package/dist/tools/grepTool.js +0 -6
- package/dist/types/marketplace.d.ts +1 -0
- package/dist/types/marketplace.d.ts.map +1 -1
- package/dist/types/processes.d.ts +4 -0
- package/dist/types/processes.d.ts.map +1 -1
- package/dist/types/skills.d.ts +1 -0
- package/dist/types/skills.d.ts.map +1 -1
- package/dist/utils/fileSearch.d.ts.map +1 -1
- package/dist/utils/fileSearch.js +1 -6
- package/dist/utils/markdownParser.js +1 -1
- package/dist/utils/messageOperations.d.ts +6 -1
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/messageOperations.js +26 -2
- package/dist/utils/openaiClient.d.ts.map +1 -1
- package/dist/utils/openaiClient.js +24 -7
- package/package.json +1 -1
- package/scripts/install_ripgrep.js +7 -5
- package/scripts/postinstall.js +10 -7
- package/src/index.ts +0 -1
- package/src/managers/backgroundTaskManager.ts +62 -6
- package/src/managers/messageManager.ts +16 -1
- package/src/managers/pluginManager.ts +1 -1
- package/src/managers/skillManager.ts +76 -35
- package/src/managers/slashCommandManager.ts +33 -10
- package/src/managers/subagentManager.ts +31 -0
- package/src/services/MarketplaceService.ts +6 -0
- package/src/services/hook.ts +16 -2
- package/src/tools/agentTool.ts +9 -3
- package/src/tools/bashTool.ts +6 -2
- package/src/tools/globTool.ts +9 -61
- package/src/tools/grepTool.ts +0 -7
- package/src/types/marketplace.ts +1 -0
- package/src/types/processes.ts +4 -0
- package/src/types/skills.ts +1 -0
- package/src/utils/fileSearch.ts +1 -6
- package/src/utils/markdownParser.ts +1 -1
- package/src/utils/messageOperations.ts +32 -1
- package/src/utils/openaiClient.ts +23 -7
- package/dist/utils/fileFilter.d.ts +0 -15
- package/dist/utils/fileFilter.d.ts.map +0 -1
- package/dist/utils/fileFilter.js +0 -35
- package/src/utils/fileFilter.ts +0 -39
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,6 @@ export * from "./agent.js";
|
|
|
4
4
|
export * from "./core/plugin.js";
|
|
5
5
|
export * from "./utils/bashParser.js";
|
|
6
6
|
export * from "./utils/convertMessagesForAPI.js";
|
|
7
|
-
export * from "./utils/fileFilter.js";
|
|
8
7
|
export * from "./utils/fileSearch.js";
|
|
9
8
|
export * from "./utils/globalLogger.js";
|
|
10
9
|
export * from "./utils/mcpUtils.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,mBAAmB,CAAC;AAGlC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AAGjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,mBAAmB,CAAC;AAGlC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AAGjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,6 @@ export * from "./core/plugin.js";
|
|
|
8
8
|
// Export all utilities
|
|
9
9
|
export * from "./utils/bashParser.js";
|
|
10
10
|
export * from "./utils/convertMessagesForAPI.js";
|
|
11
|
-
export * from "./utils/fileFilter.js";
|
|
12
11
|
export * from "./utils/fileSearch.js";
|
|
13
12
|
export * from "./utils/globalLogger.js";
|
|
14
13
|
export * from "./utils/mcpUtils.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backgroundTaskManager.d.ts","sourceRoot":"","sources":["../../src/managers/backgroundTaskManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"backgroundTaskManager.d.ts","sourceRoot":"","sources":["../../src/managers/backgroundTaskManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAIzD,OAAO,EAAE,cAAc,EAAmB,MAAM,uBAAuB,CAAC;AAGxE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAW,8BAA8B;IAC7C,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;CAC7D;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,CAAC,EAAE,8BAA8B,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,qBAAqB;IAO9B,OAAO,CAAC,SAAS;IANnB,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,OAAO,CAAS;gBAGd,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,4BAA4B;IAMvC,OAAO,CAAC,iBAAiB;IAIlB,UAAU,IAAI,MAAM;IAIpB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAKnC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI/C,WAAW,IAAI,cAAc,EAAE;IAI/B,UAAU,CACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,YAAY,CAAC;QAAC,MAAM,EAAE,MAAM,IAAI,CAAA;KAAE;IAqInD,YAAY,CACjB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,MAAM,EACf,aAAa,GAAE,MAAW,EAC1B,aAAa,GAAE,MAAW,GACzB,MAAM;IAkGF,SAAS,CACd,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,MAAM,GACd;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAiCrD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IA+B7B,OAAO,IAAI,IAAI;CAUvB"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { spawn } from "child_process";
|
|
2
|
+
import * as os from "os";
|
|
3
|
+
import * as fs from "fs";
|
|
4
|
+
import * as path from "path";
|
|
2
5
|
import { stripAnsiColors } from "../utils/stringUtils.js";
|
|
3
6
|
import { logger } from "../utils/globalLogger.js";
|
|
4
7
|
export class BackgroundTaskManager {
|
|
@@ -36,6 +39,9 @@ export class BackgroundTaskManager {
|
|
|
36
39
|
...process.env,
|
|
37
40
|
},
|
|
38
41
|
});
|
|
42
|
+
// Create log file
|
|
43
|
+
const logPath = path.join(os.tmpdir(), `wave-task-${id}.log`);
|
|
44
|
+
const logStream = fs.createWriteStream(logPath, { flags: "a" });
|
|
39
45
|
const shell = {
|
|
40
46
|
id,
|
|
41
47
|
type: "shell",
|
|
@@ -45,8 +51,10 @@ export class BackgroundTaskManager {
|
|
|
45
51
|
status: "running",
|
|
46
52
|
stdout: "",
|
|
47
53
|
stderr: "",
|
|
54
|
+
outputPath: logPath,
|
|
48
55
|
onStop: () => {
|
|
49
56
|
try {
|
|
57
|
+
logStream.end();
|
|
50
58
|
if (child.pid) {
|
|
51
59
|
process.kill(-child.pid, "SIGTERM");
|
|
52
60
|
setTimeout(() => {
|
|
@@ -81,17 +89,28 @@ export class BackgroundTaskManager {
|
|
|
81
89
|
}, timeout);
|
|
82
90
|
}
|
|
83
91
|
const onStdout = (data) => {
|
|
84
|
-
|
|
92
|
+
const stripped = stripAnsiColors(data.toString());
|
|
93
|
+
shell.stdout += stripped;
|
|
94
|
+
if (logStream.writable) {
|
|
95
|
+
logStream.write(stripped);
|
|
96
|
+
}
|
|
85
97
|
this.notifyTasksChange();
|
|
86
98
|
};
|
|
87
99
|
const onStderr = (data) => {
|
|
88
|
-
|
|
100
|
+
const stripped = stripAnsiColors(data.toString());
|
|
101
|
+
shell.stderr += stripped;
|
|
102
|
+
if (logStream.writable) {
|
|
103
|
+
logStream.write(stripped);
|
|
104
|
+
}
|
|
89
105
|
this.notifyTasksChange();
|
|
90
106
|
};
|
|
91
107
|
const onExit = (code) => {
|
|
92
108
|
if (timeoutHandle) {
|
|
93
109
|
clearTimeout(timeoutHandle);
|
|
94
110
|
}
|
|
111
|
+
if (logStream.writable) {
|
|
112
|
+
logStream.end();
|
|
113
|
+
}
|
|
95
114
|
shell.status = code === 0 ? "completed" : "failed";
|
|
96
115
|
shell.exitCode = code ?? 0;
|
|
97
116
|
shell.endTime = Date.now();
|
|
@@ -102,8 +121,13 @@ export class BackgroundTaskManager {
|
|
|
102
121
|
if (timeoutHandle) {
|
|
103
122
|
clearTimeout(timeoutHandle);
|
|
104
123
|
}
|
|
124
|
+
const stripped = `\nProcess error: ${stripAnsiColors(error.message)}`;
|
|
105
125
|
shell.status = "failed";
|
|
106
|
-
shell.stderr +=
|
|
126
|
+
shell.stderr += stripped;
|
|
127
|
+
if (logStream.writable) {
|
|
128
|
+
logStream.write(stripped);
|
|
129
|
+
logStream.end();
|
|
130
|
+
}
|
|
107
131
|
shell.exitCode = 1;
|
|
108
132
|
shell.endTime = Date.now();
|
|
109
133
|
shell.runtime = shell.endTime - startTime;
|
|
@@ -121,6 +145,7 @@ export class BackgroundTaskManager {
|
|
|
121
145
|
if (timeoutHandle) {
|
|
122
146
|
clearTimeout(timeoutHandle);
|
|
123
147
|
}
|
|
148
|
+
logStream.end();
|
|
124
149
|
this.tasks.delete(id);
|
|
125
150
|
this.notifyTasksChange();
|
|
126
151
|
};
|
|
@@ -129,6 +154,16 @@ export class BackgroundTaskManager {
|
|
|
129
154
|
adoptProcess(child, command, initialStdout = "", initialStderr = "") {
|
|
130
155
|
const id = this.generateId();
|
|
131
156
|
const startTime = Date.now();
|
|
157
|
+
// Create log file
|
|
158
|
+
const logPath = path.join(os.tmpdir(), `wave-task-${id}.log`);
|
|
159
|
+
const logStream = fs.createWriteStream(logPath, { flags: "a" });
|
|
160
|
+
// Write initial output to log file
|
|
161
|
+
if (initialStdout) {
|
|
162
|
+
logStream.write(stripAnsiColors(initialStdout));
|
|
163
|
+
}
|
|
164
|
+
if (initialStderr) {
|
|
165
|
+
logStream.write(stripAnsiColors(initialStderr));
|
|
166
|
+
}
|
|
132
167
|
const shell = {
|
|
133
168
|
id,
|
|
134
169
|
type: "shell",
|
|
@@ -138,8 +173,10 @@ export class BackgroundTaskManager {
|
|
|
138
173
|
status: "running",
|
|
139
174
|
stdout: initialStdout,
|
|
140
175
|
stderr: initialStderr,
|
|
176
|
+
outputPath: logPath,
|
|
141
177
|
onStop: () => {
|
|
142
178
|
try {
|
|
179
|
+
logStream.end();
|
|
143
180
|
if (child.pid) {
|
|
144
181
|
process.kill(-child.pid, "SIGTERM");
|
|
145
182
|
setTimeout(() => {
|
|
@@ -165,14 +202,25 @@ export class BackgroundTaskManager {
|
|
|
165
202
|
this.tasks.set(id, shell);
|
|
166
203
|
this.notifyTasksChange();
|
|
167
204
|
child.stdout?.on("data", (data) => {
|
|
168
|
-
|
|
205
|
+
const stripped = stripAnsiColors(data.toString());
|
|
206
|
+
shell.stdout += stripped;
|
|
207
|
+
if (logStream.writable) {
|
|
208
|
+
logStream.write(stripped);
|
|
209
|
+
}
|
|
169
210
|
this.notifyTasksChange();
|
|
170
211
|
});
|
|
171
212
|
child.stderr?.on("data", (data) => {
|
|
172
|
-
|
|
213
|
+
const stripped = stripAnsiColors(data.toString());
|
|
214
|
+
shell.stderr += stripped;
|
|
215
|
+
if (logStream.writable) {
|
|
216
|
+
logStream.write(stripped);
|
|
217
|
+
}
|
|
173
218
|
this.notifyTasksChange();
|
|
174
219
|
});
|
|
175
220
|
child.on("exit", (code) => {
|
|
221
|
+
if (logStream.writable) {
|
|
222
|
+
logStream.end();
|
|
223
|
+
}
|
|
176
224
|
shell.status = code === 0 ? "completed" : "failed";
|
|
177
225
|
shell.exitCode = code ?? 0;
|
|
178
226
|
shell.endTime = Date.now();
|
|
@@ -180,8 +228,13 @@ export class BackgroundTaskManager {
|
|
|
180
228
|
this.notifyTasksChange();
|
|
181
229
|
});
|
|
182
230
|
child.on("error", (error) => {
|
|
231
|
+
const stripped = `\nProcess error: ${stripAnsiColors(error.message)}`;
|
|
183
232
|
shell.status = "failed";
|
|
184
|
-
shell.stderr +=
|
|
233
|
+
shell.stderr += stripped;
|
|
234
|
+
if (logStream.writable) {
|
|
235
|
+
logStream.write(stripped);
|
|
236
|
+
logStream.end();
|
|
237
|
+
}
|
|
185
238
|
shell.exitCode = 1;
|
|
186
239
|
shell.endTime = Date.now();
|
|
187
240
|
shell.runtime = shell.endTime - startTime;
|
|
@@ -96,7 +96,11 @@ export declare class MessageManager {
|
|
|
96
96
|
*/
|
|
97
97
|
triggerSlashCommandsChange(commands: SlashCommand[]): void;
|
|
98
98
|
initializeFromSession(sessionData: SessionData): void;
|
|
99
|
-
addUserMessage(params: UserMessageParams):
|
|
99
|
+
addUserMessage(params: UserMessageParams): string;
|
|
100
|
+
/**
|
|
101
|
+
* Update an existing user message by its ID.
|
|
102
|
+
*/
|
|
103
|
+
updateUserMessage(id: string, params: Partial<UserMessageParams>): void;
|
|
100
104
|
addAssistantMessage(content?: string, toolCalls?: ChatCompletionMessageFunctionToolCall[], usage?: Usage, additionalFields?: Record<string, unknown>): void;
|
|
101
105
|
mergeAssistantAdditionalFields(additionalFields: Record<string, unknown>): void;
|
|
102
106
|
updateToolBlock(params: AgentToolBlockUpdateParams): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageManager.d.ts","sourceRoot":"","sources":["../../src/managers/messageManager.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"messageManager.d.ts","sourceRoot":"","sources":["../../src/managers/messageManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAUL,iBAAiB,EACjB,KAAK,0BAA0B,EAEhC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,EAIL,WAAW,EAEZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qCAAqC,EAAE,MAAM,qBAAqB,CAAC;AAK5E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAW,uBAAuB;IACtC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACjD,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,yBAAyB,CAAC,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IAE3C,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAEzD,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAC;IAErC,yBAAyB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAEzE,2BAA2B,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3E,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAClE,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,wBAAwB,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5D,kBAAkB,CAAC,EAAE,CACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,SAAS,GAAG,MAAM,EACxB,WAAW,EAAE,MAAM,KAChB,IAAI,CAAC;IAEV,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,qBAAqB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACpE,qBAAqB,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;IAC3D,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAE7C,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,uBAAuB,CAAC,EAAE,CACxB,SAAS,EAAE,OAAO,uBAAuB,EAAE,YAAY,EAAE,KACtD,IAAI,CAAC;CACX;AAID,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,uBAAuB,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,cAAc;IAkBvB,OAAO,CAAC,SAAS;IAhBnB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAe;gBAGpB,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,qBAAqB;IAiBhC,OAAO,KAAK,iBAAiB,GAI5B;IAED,OAAO,KAAK,aAAa,GAMxB;IAGM,YAAY,IAAI,MAAM;IAItB,gBAAgB,IAAI,MAAM;IAI1B,kBAAkB,IAAI,MAAM,GAAG,SAAS;IAIxC,WAAW,IAAI,OAAO,EAAE;IAIxB,SAAS,IAAI,KAAK,EAAE;IAIpB,oBAAoB,IAAI,MAAM;IAI9B,UAAU,IAAI,MAAM;IAI3B;;OAEG;IACI,iBAAiB,IAAI,MAAM,EAAE;IAI7B,aAAa,IAAI,MAAM;IAIvB,iBAAiB,IAAI,MAAM;IAIlC;;OAEG;IACU,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAsBjD;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAStB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAY5C;;OAEG;YACW,qBAAqB;IAQ5B,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI;IAM7C;;OAEG;IACU,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAiClC,oBAAoB,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI;IAQ5D;;OAEG;IACI,aAAa,IAAI,IAAI;IAS5B;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAIhC;;OAEG;IACI,0BAA0B,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI;IAK1D,qBAAqB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAcrD,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM;IAcxD;;OAEG;IACI,iBAAiB,CACtB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,GACjC,IAAI;IAKA,mBAAmB,CACxB,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,qCAAqC,EAAE,EACnD,KAAK,CAAC,EAAE,KAAK,EACb,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACzC,IAAI;IAsBA,8BAA8B,CACnC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACxC,IAAI;IA+BA,eAAe,CAAC,MAAM,EAAE,0BAA0B,GAAG,IAAI;IAWzD,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IASlC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAY1C;;OAEG;IACI,gCAAgC,CACrC,iBAAiB,EAAE,MAAM,EACzB,KAAK,CAAC,EAAE,KAAK,GACZ,IAAI;IAsCA,mBAAmB,CACxB,SAAS,EAAE,OAAO,uBAAuB,EAAE,YAAY,EAAE,GACxD,IAAI;IAeA,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IASrC,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAUxD,mBAAmB,CACxB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GACd,IAAI;IAWP;;;OAGG;IACI,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI;IAW1D;;;OAGG;IACI,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAKnC;;OAEG;IACI,kBAAkB,IAAI,IAAI;IAIjC;;;;OAIG;IACI,2BAA2B,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI;IA6CvE;;;OAGG;IACI,6BAA6B,CAAC,uBAAuB,EAAE,MAAM,GAAG,IAAI;IA8C3E;;;OAGG;IACI,qBAAqB,IAAI,IAAI;IAKvB,oBAAoB,IAAI,OAAO,CAAC;QAC3C,QAAQ,EAAE,OAAO,EAAE,CAAC;QACpB,UAAU,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;IAKF;;;;OAIG;IACU,eAAe,CAC1B,KAAK,EAAE,MAAM,EACb,gBAAgB,CAAC,EAAE,OAAO,uBAAuB,EAAE,gBAAgB,GAClE,OAAO,CAAC,IAAI,CAAC;IAkGhB;;OAEG;YACW,kBAAkB;IAoBhC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAyB5B,OAAO,CAAC,sBAAsB;CA4B/B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { addAssistantMessageToMessages, updateToolBlockInMessage, addErrorBlockToMessage, addUserMessageToMessages, addBangMessage, updateBangInMessage, completeBangInMessage, removeLastUserMessage, generateMessageId, } from "../utils/messageOperations.js";
|
|
1
|
+
import { addAssistantMessageToMessages, updateToolBlockInMessage, addErrorBlockToMessage, addUserMessageToMessages, updateUserMessageInMessages, addBangMessage, updateBangInMessage, completeBangInMessage, removeLastUserMessage, generateMessageId, } from "../utils/messageOperations.js";
|
|
2
2
|
import { join } from "path";
|
|
3
3
|
import { appendMessages, createSession, generateSessionId, SESSION_DIR, } from "../services/session.js";
|
|
4
4
|
import { pathEncoder } from "../utils/pathEncoder.js";
|
|
@@ -191,13 +191,23 @@ export class MessageManager {
|
|
|
191
191
|
}
|
|
192
192
|
// Encapsulated message operation functions
|
|
193
193
|
addUserMessage(params) {
|
|
194
|
+
const id = generateMessageId();
|
|
194
195
|
const newMessages = addUserMessageToMessages({
|
|
195
196
|
messages: this.messages,
|
|
196
197
|
...params,
|
|
198
|
+
id,
|
|
197
199
|
});
|
|
198
200
|
this.setMessages(newMessages);
|
|
199
201
|
this.callbacks.onUserMessageAdded?.(params);
|
|
200
202
|
// Note: Subagent-specific callbacks are now handled by SubagentManager
|
|
203
|
+
return id;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Update an existing user message by its ID.
|
|
207
|
+
*/
|
|
208
|
+
updateUserMessage(id, params) {
|
|
209
|
+
const newMessages = updateUserMessageInMessages(this.messages, id, params);
|
|
210
|
+
this.setMessages(newMessages);
|
|
201
211
|
}
|
|
202
212
|
addAssistantMessage(content, toolCalls, usage, additionalFields) {
|
|
203
213
|
const additionalFieldsRecord = additionalFields
|
|
@@ -113,7 +113,7 @@ export class PluginManager {
|
|
|
113
113
|
this.slashCommandManager.registerPluginCommands(plugin.name, plugin.commands);
|
|
114
114
|
}
|
|
115
115
|
if (this.skillManager && plugin.skills.length > 0) {
|
|
116
|
-
this.skillManager.registerPluginSkills(plugin.skills);
|
|
116
|
+
this.skillManager.registerPluginSkills(plugin.name, plugin.skills);
|
|
117
117
|
}
|
|
118
118
|
if (this.lspManager && plugin.lspConfig) {
|
|
119
119
|
for (const [language, config] of Object.entries(plugin.lspConfig)) {
|
|
@@ -54,9 +54,23 @@ export declare class SkillManager {
|
|
|
54
54
|
allowedTools?: string[];
|
|
55
55
|
}>;
|
|
56
56
|
/**
|
|
57
|
-
*
|
|
57
|
+
* Prepare a skill by name without executing bash commands
|
|
58
58
|
*/
|
|
59
|
-
|
|
59
|
+
prepareSkill(args: SkillToolArgs): Promise<{
|
|
60
|
+
content: string;
|
|
61
|
+
skill: Skill;
|
|
62
|
+
} | {
|
|
63
|
+
content: string;
|
|
64
|
+
skill?: undefined;
|
|
65
|
+
}>;
|
|
66
|
+
/**
|
|
67
|
+
* Prepare skill content with arguments but without bash execution
|
|
68
|
+
*/
|
|
69
|
+
private prepareSkillContent;
|
|
70
|
+
/**
|
|
71
|
+
* Execute bash commands in prepared skill content
|
|
72
|
+
*/
|
|
73
|
+
private executeBashInSkillContent;
|
|
60
74
|
/**
|
|
61
75
|
* Format available skills list for error messages
|
|
62
76
|
*/
|
|
@@ -64,6 +78,6 @@ export declare class SkillManager {
|
|
|
64
78
|
/**
|
|
65
79
|
* Register skills provided by a plugin
|
|
66
80
|
*/
|
|
67
|
-
registerPluginSkills(skills: Skill[]): void;
|
|
81
|
+
registerPluginSkills(pluginName: string, skills: Skill[]): void;
|
|
68
82
|
}
|
|
69
83
|
//# sourceMappingURL=skillManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillManager.d.ts","sourceRoot":"","sources":["../../src/managers/skillManager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,KAAK,EAGL,aAAa,EACb,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAS3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD;;GAEG;AACH,qBAAa,YAAY;IAUrB,OAAO,CAAC,SAAS;IATnB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,WAAW,CAAS;gBAGlB,SAAS,EAAE,SAAS,EAC5B,OAAO,GAAE,mBAAwB;IAQnC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoCjC;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,kBAAkB,IAAI,aAAa,EAAE;IAQrC;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAQzD;;;OAGG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAgBzD;;OAEG;YACW,cAAc;IAkB5B;;OAEG;YACW,uBAAuB;IA8ErC;;OAEG;YACW,oBAAoB;
|
|
1
|
+
{"version":3,"file":"skillManager.d.ts","sourceRoot":"","sources":["../../src/managers/skillManager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,KAAK,EAGL,aAAa,EACb,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAS3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD;;GAEG;AACH,qBAAa,YAAY;IAUrB,OAAO,CAAC,SAAS;IATnB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,WAAW,CAAS;gBAGlB,SAAS,EAAE,SAAS,EAC5B,OAAO,GAAE,mBAAwB;IAQnC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoCjC;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,kBAAkB,IAAI,aAAa,EAAE;IAQrC;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAQzD;;;OAGG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAgBzD;;OAEG;YACW,cAAc;IAkB5B;;OAEG;YACW,uBAAuB;IA8ErC;;OAEG;YACW,oBAAoB;IA4BlC;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;QAC/C,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,sBAAsB,CAAC;QACjC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IA8BF;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAC5C;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,KAAK,CAAC;KACd,GACD;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,SAAS,CAAA;KAAE,CACzC;IA6BD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;OAEG;YACW,yBAAyB;IASvC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;CA0BhE"}
|
|
@@ -179,8 +179,20 @@ export class SkillManager {
|
|
|
179
179
|
try {
|
|
180
180
|
const entries = await readdir(skillsPath, { withFileTypes: true });
|
|
181
181
|
for (const entry of entries) {
|
|
182
|
+
const fullPath = join(skillsPath, entry.name);
|
|
182
183
|
if (entry.isDirectory()) {
|
|
183
|
-
directories.push(
|
|
184
|
+
directories.push(fullPath);
|
|
185
|
+
}
|
|
186
|
+
else if (entry.isSymbolicLink()) {
|
|
187
|
+
try {
|
|
188
|
+
const s = await stat(fullPath);
|
|
189
|
+
if (s.isDirectory()) {
|
|
190
|
+
directories.push(fullPath);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Ignore broken symlinks or other errors
|
|
195
|
+
}
|
|
184
196
|
}
|
|
185
197
|
}
|
|
186
198
|
}
|
|
@@ -193,10 +205,35 @@ export class SkillManager {
|
|
|
193
205
|
* Execute a skill by name
|
|
194
206
|
*/
|
|
195
207
|
async executeSkill(args) {
|
|
208
|
+
const { skill_name } = args;
|
|
209
|
+
logger?.debug(`Invoking skill: ${skill_name}`);
|
|
210
|
+
const prepared = await this.prepareSkill(args);
|
|
211
|
+
if (!prepared.skill) {
|
|
212
|
+
return { content: prepared.content };
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
const finalContent = await this.executeBashInSkillContent(prepared.content);
|
|
216
|
+
return {
|
|
217
|
+
content: finalContent,
|
|
218
|
+
context: {
|
|
219
|
+
skillName: skill_name,
|
|
220
|
+
},
|
|
221
|
+
allowedTools: prepared.skill.allowedTools,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
logger?.error(`Failed to execute skill '${skill_name}':`, error);
|
|
226
|
+
return {
|
|
227
|
+
content: `❌ **Error executing skill**: ${error instanceof Error ? error.message : String(error)}`,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Prepare a skill by name without executing bash commands
|
|
233
|
+
*/
|
|
234
|
+
async prepareSkill(args) {
|
|
196
235
|
const { skill_name, args: skillArgs } = args;
|
|
197
|
-
logger?.debug(`Invoking skill: ${skill_name} with args: ${skillArgs}`);
|
|
198
236
|
try {
|
|
199
|
-
// Load the skill
|
|
200
237
|
const skill = await this.loadSkill(skill_name);
|
|
201
238
|
if (!skill) {
|
|
202
239
|
return {
|
|
@@ -209,28 +246,20 @@ export class SkillManager {
|
|
|
209
246
|
content: `❌ **Skill validation failed**:\n\n\`\`\`\n${errorMsg}\n\`\`\``,
|
|
210
247
|
};
|
|
211
248
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
// Return skill content with context
|
|
215
|
-
return {
|
|
216
|
-
content: processedContent,
|
|
217
|
-
context: {
|
|
218
|
-
skillName: skill_name,
|
|
219
|
-
},
|
|
220
|
-
allowedTools: skill.allowedTools,
|
|
221
|
-
};
|
|
249
|
+
const preparedContent = this.prepareSkillContent(skill, skillArgs || "");
|
|
250
|
+
return { content: preparedContent, skill };
|
|
222
251
|
}
|
|
223
252
|
catch (error) {
|
|
224
|
-
logger?.error(`Failed to
|
|
253
|
+
logger?.error(`Failed to prepare skill '${skill_name}':`, error);
|
|
225
254
|
return {
|
|
226
|
-
content: `❌ **Error
|
|
255
|
+
content: `❌ **Error preparing skill**: ${error instanceof Error ? error.message : String(error)}`,
|
|
227
256
|
};
|
|
228
257
|
}
|
|
229
258
|
}
|
|
230
259
|
/**
|
|
231
|
-
*
|
|
260
|
+
* Prepare skill content with arguments but without bash execution
|
|
232
261
|
*/
|
|
233
|
-
|
|
262
|
+
prepareSkillContent(skill, argsString) {
|
|
234
263
|
const header = `🧠 **${skill.name}** (${skill.type} skill)\n\n`;
|
|
235
264
|
const description = `*${skill.description}*\n\n`;
|
|
236
265
|
const skillPath = `📁 Skill location: \`${skill.skillPath}\`\n\n`;
|
|
@@ -241,13 +270,18 @@ export class SkillManager {
|
|
|
241
270
|
mainContent = substituteCommandParameters(mainContent, argsString);
|
|
242
271
|
// 2. Substitute ${WAVE_SKILL_DIR} with the skill's directory path
|
|
243
272
|
mainContent = mainContent.replace(/\$\{WAVE_SKILL_DIR\}/g, skill.skillPath);
|
|
244
|
-
|
|
245
|
-
|
|
273
|
+
return header + description + skillPath + mainContent;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Execute bash commands in prepared skill content
|
|
277
|
+
*/
|
|
278
|
+
async executeBashInSkillContent(content) {
|
|
279
|
+
const { commands } = parseBashCommands(content);
|
|
246
280
|
if (commands.length > 0) {
|
|
247
281
|
const results = await executeBashCommands(commands, this.workdir);
|
|
248
|
-
|
|
282
|
+
return replaceBashCommandsWithOutput(content, results);
|
|
249
283
|
}
|
|
250
|
-
return
|
|
284
|
+
return content;
|
|
251
285
|
}
|
|
252
286
|
/**
|
|
253
287
|
* Format available skills list for error messages
|
|
@@ -264,10 +298,11 @@ export class SkillManager {
|
|
|
264
298
|
/**
|
|
265
299
|
* Register skills provided by a plugin
|
|
266
300
|
*/
|
|
267
|
-
registerPluginSkills(skills) {
|
|
301
|
+
registerPluginSkills(pluginName, skills) {
|
|
268
302
|
for (const skill of skills) {
|
|
303
|
+
const namespacedName = `${pluginName}:${skill.name}`;
|
|
269
304
|
const metadata = {
|
|
270
|
-
name:
|
|
305
|
+
name: namespacedName,
|
|
271
306
|
description: skill.description,
|
|
272
307
|
type: skill.type,
|
|
273
308
|
skillPath: skill.skillPath,
|
|
@@ -277,10 +312,13 @@ export class SkillManager {
|
|
|
277
312
|
model: skill.model,
|
|
278
313
|
disableModelInvocation: skill.disableModelInvocation,
|
|
279
314
|
userInvocable: skill.userInvocable,
|
|
315
|
+
pluginName,
|
|
280
316
|
};
|
|
281
|
-
|
|
282
|
-
|
|
317
|
+
// Update the skill object itself to have the namespaced name
|
|
318
|
+
skill.name = namespacedName;
|
|
319
|
+
this.skillMetadata.set(namespacedName, metadata);
|
|
320
|
+
this.skillContent.set(namespacedName, skill);
|
|
283
321
|
}
|
|
284
|
-
logger?.debug(`Registered ${skills.length} plugin skills. Total skills: ${this.skillMetadata.size}`);
|
|
322
|
+
logger?.debug(`Registered ${skills.length} plugin skills from ${pluginName}. Total skills: ${this.skillMetadata.size}`);
|
|
285
323
|
}
|
|
286
324
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slashCommandManager.d.ts","sourceRoot":"","sources":["../../src/managers/slashCommandManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAQ1E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAQlD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxD,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,mBAAmB;IAO5B,OAAO,CAAC,SAAS;IANnB,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,OAAO,CAAS;gBAGd,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,0BAA0B;IAK9B,UAAU,IAAI,IAAI;IAKzB,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,KAAK,qBAAqB,GAEhC;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,CAAC,yBAAyB;IAoBjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA4C1B;;OAEG;IACI,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"slashCommandManager.d.ts","sourceRoot":"","sources":["../../src/managers/slashCommandManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAQ1E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAQlD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxD,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,mBAAmB;IAO5B,OAAO,CAAC,SAAS;IANnB,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,OAAO,CAAS;gBAGd,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,0BAA0B;IAK9B,UAAU,IAAI,IAAI;IAKzB,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,KAAK,qBAAqB,GAEhC;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,CAAC,yBAAyB;IAoBjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA4C1B;;OAEG;IACI,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;IA2E3D;;OAEG;IACI,sBAAsB,CAC3B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,kBAAkB,EAAE,GAC7B,IAAI;IA2CP;;OAEG;IACI,oBAAoB,IAAI,IAAI;IAWnC;;OAEG;IACI,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAKnD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACI,WAAW,IAAI,YAAY,EAAE;IAIpC;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI9D;;OAEG;IACU,cAAc,CACzB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC;IAenB;;;OAGG;IACI,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG;QAClD,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf;IAeD;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI7C;;OAEG;IACI,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAI1E;;OAEG;IACI,iBAAiB,IAAI,kBAAkB,EAAE;IAIhD;;OAEG;YACW,+BAA+B;IAsD7C;;OAEG;IACI,mBAAmB,IAAI,IAAI;CAInC"}
|
|
@@ -100,19 +100,33 @@ export class SlashCommandManager {
|
|
|
100
100
|
description: `Skill: ${skill.description}`,
|
|
101
101
|
handler: async (args) => {
|
|
102
102
|
try {
|
|
103
|
-
|
|
103
|
+
// 1. Prepare skill content immediately
|
|
104
|
+
const prepared = await this.skillManager.prepareSkill({
|
|
104
105
|
skill_name: skill.name,
|
|
105
106
|
args,
|
|
106
107
|
});
|
|
107
|
-
// Add user message with skill content
|
|
108
108
|
const originalInput = args
|
|
109
109
|
? `/${skill.name} ${args}`
|
|
110
110
|
: `/${skill.name}`;
|
|
111
|
-
|
|
111
|
+
// 2. Add user message immediately
|
|
112
|
+
const messageId = this.messageManager.addUserMessage({
|
|
112
113
|
content: originalInput,
|
|
114
|
+
customCommandContent: prepared.content,
|
|
115
|
+
});
|
|
116
|
+
if (!prepared.skill) {
|
|
117
|
+
// If skill not found or invalid, we're done (error message already in prepared.content)
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// 3. Execute bash commands asynchronously
|
|
121
|
+
const result = await this.skillManager.executeSkill({
|
|
122
|
+
skill_name: skill.name,
|
|
123
|
+
args,
|
|
124
|
+
});
|
|
125
|
+
// 4. Update the message with final content
|
|
126
|
+
this.messageManager.updateUserMessage(messageId, {
|
|
113
127
|
customCommandContent: result.content,
|
|
114
128
|
});
|
|
115
|
-
// Trigger AI response
|
|
129
|
+
// 5. Trigger AI response
|
|
116
130
|
await this.aiManager.sendAIMessage({
|
|
117
131
|
model: skill.model,
|
|
118
132
|
allowedRules: result.allowedTools,
|
|
@@ -251,6 +265,14 @@ export class SlashCommandManager {
|
|
|
251
265
|
*/
|
|
252
266
|
async executeCustomCommandInMainAgent(commandName, content, config, args) {
|
|
253
267
|
try {
|
|
268
|
+
// Add custom command message immediately to show the command being executed
|
|
269
|
+
const originalInput = args
|
|
270
|
+
? `/${commandName} ${args}`
|
|
271
|
+
: `/${commandName}`;
|
|
272
|
+
const messageId = this.messageManager.addUserMessage({
|
|
273
|
+
content: originalInput,
|
|
274
|
+
customCommandContent: content, // Initial content with bash placeholders
|
|
275
|
+
});
|
|
254
276
|
// Parse bash commands from the content
|
|
255
277
|
const { commands, processedContent } = parseBashCommands(content);
|
|
256
278
|
// Execute bash commands if any
|
|
@@ -259,12 +281,8 @@ export class SlashCommandManager {
|
|
|
259
281
|
const bashResults = await executeBashCommands(commands, this.workdir);
|
|
260
282
|
finalContent = replaceBashCommandsWithOutput(processedContent, bashResults);
|
|
261
283
|
}
|
|
262
|
-
//
|
|
263
|
-
|
|
264
|
-
? `/${commandName} ${args}`
|
|
265
|
-
: `/${commandName}`;
|
|
266
|
-
this.messageManager.addUserMessage({
|
|
267
|
-
content: originalInput,
|
|
284
|
+
// Update the message with final content
|
|
285
|
+
this.messageManager.updateUserMessage(messageId, {
|
|
268
286
|
customCommandContent: finalContent,
|
|
269
287
|
});
|
|
270
288
|
// Execute the AI conversation with custom configuration
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
1
2
|
import type { SubagentConfiguration } from "../utils/subagentParser.js";
|
|
2
3
|
import type { Message, Usage } from "../types/index.js";
|
|
3
4
|
import { AIManager } from "./aiManager.js";
|
|
@@ -36,6 +37,7 @@ export interface SubagentInstance {
|
|
|
36
37
|
backgroundTaskId?: string;
|
|
37
38
|
onUpdate?: () => void;
|
|
38
39
|
model?: string;
|
|
40
|
+
logStream?: fs.WriteStream;
|
|
39
41
|
}
|
|
40
42
|
export interface SubagentManagerOptions {
|
|
41
43
|
workdir: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagentManager.d.ts","sourceRoot":"","sources":["../../src/managers/subagentManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"subagentManager.d.ts","sourceRoot":"","sources":["../../src/managers/subagentManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { randomUUID } from "crypto";
|
|
2
|
+
import * as os from "os";
|
|
3
|
+
import * as fs from "fs";
|
|
4
|
+
import * as path from "path";
|
|
2
5
|
import { AIManager } from "./aiManager.js";
|
|
3
6
|
import { MessageManager } from "./messageManager.js";
|
|
4
7
|
import { ToolManager } from "./toolManager.js";
|
|
@@ -142,6 +145,10 @@ export class SubagentManager {
|
|
|
142
145
|
if (runInBackground && backgroundTaskManager) {
|
|
143
146
|
const taskId = backgroundTaskManager.generateId();
|
|
144
147
|
const startTime = Date.now();
|
|
148
|
+
// Create log file
|
|
149
|
+
const logPath = path.join(os.tmpdir(), `wave-subagent-${taskId}.log`);
|
|
150
|
+
const logStream = fs.createWriteStream(logPath, { flags: "a" });
|
|
151
|
+
instance.logStream = logStream;
|
|
145
152
|
backgroundTaskManager.addTask({
|
|
146
153
|
id: taskId,
|
|
147
154
|
type: "subagent",
|
|
@@ -150,8 +157,10 @@ export class SubagentManager {
|
|
|
150
157
|
description: instance.description,
|
|
151
158
|
stdout: "",
|
|
152
159
|
stderr: "",
|
|
160
|
+
outputPath: logPath,
|
|
153
161
|
subagentId: instance.subagentId,
|
|
154
162
|
onStop: () => {
|
|
163
|
+
instance.logStream?.end();
|
|
155
164
|
instance.aiManager.abortAIMessage();
|
|
156
165
|
this.cleanupInstance(instance.subagentId);
|
|
157
166
|
},
|
|
@@ -202,6 +211,10 @@ export class SubagentManager {
|
|
|
202
211
|
}
|
|
203
212
|
const taskId = backgroundTaskManager.generateId();
|
|
204
213
|
const startTime = Date.now();
|
|
214
|
+
// Create log file
|
|
215
|
+
const logPath = path.join(os.tmpdir(), `wave-subagent-${taskId}.log`);
|
|
216
|
+
const logStream = fs.createWriteStream(logPath, { flags: "a" });
|
|
217
|
+
instance.logStream = logStream;
|
|
205
218
|
backgroundTaskManager.addTask({
|
|
206
219
|
id: taskId,
|
|
207
220
|
type: "subagent",
|
|
@@ -210,8 +223,10 @@ export class SubagentManager {
|
|
|
210
223
|
description: instance.description,
|
|
211
224
|
stdout: "",
|
|
212
225
|
stderr: "",
|
|
226
|
+
outputPath: logPath,
|
|
213
227
|
subagentId: instance.subagentId,
|
|
214
228
|
onStop: () => {
|
|
229
|
+
instance.logStream?.end();
|
|
215
230
|
instance.aiManager.abortAIMessage();
|
|
216
231
|
this.cleanupInstance(instance.subagentId);
|
|
217
232
|
},
|
|
@@ -285,6 +300,7 @@ export class SubagentManager {
|
|
|
285
300
|
: undefined;
|
|
286
301
|
// If this was transitioned to background, update the background task
|
|
287
302
|
if (instance.backgroundTaskId && backgroundTaskManager) {
|
|
303
|
+
instance.logStream?.end();
|
|
288
304
|
const task = backgroundTaskManager.getTask(instance.backgroundTaskId);
|
|
289
305
|
if (task) {
|
|
290
306
|
task.status = "completed";
|
|
@@ -303,6 +319,7 @@ export class SubagentManager {
|
|
|
303
319
|
: undefined;
|
|
304
320
|
// If this was transitioned to background, update the background task with error
|
|
305
321
|
if (instance.backgroundTaskId && backgroundTaskManager) {
|
|
322
|
+
instance.logStream?.end();
|
|
306
323
|
const task = backgroundTaskManager.getTask(instance.backgroundTaskId);
|
|
307
324
|
if (task) {
|
|
308
325
|
task.status = "failed";
|
|
@@ -412,6 +429,11 @@ export class SubagentManager {
|
|
|
412
429
|
instance.lastTools.shift();
|
|
413
430
|
}
|
|
414
431
|
instance.onUpdate?.();
|
|
432
|
+
// Log tool execution to file
|
|
433
|
+
if (instance.logStream) {
|
|
434
|
+
const compactParams = (params.parameters || "{}").substring(0, 100);
|
|
435
|
+
instance.logStream.write(`[${new Date().toISOString()}] Running tool: ${params.name} with params: ${compactParams}${compactParams.length >= 100 ? "..." : ""}\n`);
|
|
436
|
+
}
|
|
415
437
|
}
|
|
416
438
|
}
|
|
417
439
|
// Forward tool block updates to parent via SubagentManager callbacks
|