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.
Files changed (70) hide show
  1. package/dist/index.d.ts +0 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +0 -1
  4. package/dist/managers/backgroundTaskManager.d.ts.map +1 -1
  5. package/dist/managers/backgroundTaskManager.js +59 -6
  6. package/dist/managers/messageManager.d.ts +5 -1
  7. package/dist/managers/messageManager.d.ts.map +1 -1
  8. package/dist/managers/messageManager.js +11 -1
  9. package/dist/managers/pluginManager.js +1 -1
  10. package/dist/managers/skillManager.d.ts +17 -3
  11. package/dist/managers/skillManager.d.ts.map +1 -1
  12. package/dist/managers/skillManager.js +64 -26
  13. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  14. package/dist/managers/slashCommandManager.js +28 -10
  15. package/dist/managers/subagentManager.d.ts +2 -0
  16. package/dist/managers/subagentManager.d.ts.map +1 -1
  17. package/dist/managers/subagentManager.js +22 -0
  18. package/dist/services/MarketplaceService.d.ts.map +1 -1
  19. package/dist/services/MarketplaceService.js +4 -0
  20. package/dist/services/hook.d.ts.map +1 -1
  21. package/dist/services/hook.js +15 -2
  22. package/dist/tools/agentTool.d.ts.map +1 -1
  23. package/dist/tools/agentTool.js +7 -3
  24. package/dist/tools/bashTool.d.ts.map +1 -1
  25. package/dist/tools/bashTool.js +6 -2
  26. package/dist/tools/globTool.d.ts.map +1 -1
  27. package/dist/tools/globTool.js +9 -48
  28. package/dist/tools/grepTool.d.ts.map +1 -1
  29. package/dist/tools/grepTool.js +0 -6
  30. package/dist/types/marketplace.d.ts +1 -0
  31. package/dist/types/marketplace.d.ts.map +1 -1
  32. package/dist/types/processes.d.ts +4 -0
  33. package/dist/types/processes.d.ts.map +1 -1
  34. package/dist/types/skills.d.ts +1 -0
  35. package/dist/types/skills.d.ts.map +1 -1
  36. package/dist/utils/fileSearch.d.ts.map +1 -1
  37. package/dist/utils/fileSearch.js +1 -6
  38. package/dist/utils/markdownParser.js +1 -1
  39. package/dist/utils/messageOperations.d.ts +6 -1
  40. package/dist/utils/messageOperations.d.ts.map +1 -1
  41. package/dist/utils/messageOperations.js +26 -2
  42. package/dist/utils/openaiClient.d.ts.map +1 -1
  43. package/dist/utils/openaiClient.js +24 -7
  44. package/package.json +1 -1
  45. package/scripts/install_ripgrep.js +7 -5
  46. package/scripts/postinstall.js +10 -7
  47. package/src/index.ts +0 -1
  48. package/src/managers/backgroundTaskManager.ts +62 -6
  49. package/src/managers/messageManager.ts +16 -1
  50. package/src/managers/pluginManager.ts +1 -1
  51. package/src/managers/skillManager.ts +76 -35
  52. package/src/managers/slashCommandManager.ts +33 -10
  53. package/src/managers/subagentManager.ts +31 -0
  54. package/src/services/MarketplaceService.ts +6 -0
  55. package/src/services/hook.ts +16 -2
  56. package/src/tools/agentTool.ts +9 -3
  57. package/src/tools/bashTool.ts +6 -2
  58. package/src/tools/globTool.ts +9 -61
  59. package/src/tools/grepTool.ts +0 -7
  60. package/src/types/marketplace.ts +1 -0
  61. package/src/types/processes.ts +4 -0
  62. package/src/types/skills.ts +1 -0
  63. package/src/utils/fileSearch.ts +1 -6
  64. package/src/utils/markdownParser.ts +1 -1
  65. package/src/utils/messageOperations.ts +32 -1
  66. package/src/utils/openaiClient.ts +23 -7
  67. package/dist/utils/fileFilter.d.ts +0 -15
  68. package/dist/utils/fileFilter.d.ts.map +0 -1
  69. package/dist/utils/fileFilter.js +0 -35
  70. 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";
@@ -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,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"}
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;AACzD,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;IA8GnD,YAAY,CACjB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,MAAM,EACf,aAAa,GAAE,MAAW,EAC1B,aAAa,GAAE,MAAW,GACzB,MAAM;IAoEF,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
+ {"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
- shell.stdout += stripAnsiColors(data.toString());
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
- shell.stderr += stripAnsiColors(data.toString());
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 += `\nProcess error: ${stripAnsiColors(error.message)}`;
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
- shell.stdout += stripAnsiColors(data.toString());
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
- shell.stderr += stripAnsiColors(data.toString());
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 += `\nProcess error: ${stripAnsiColors(error.message)}`;
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): void;
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":"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"}
1
+ {"version":3,"file":"messageManager.d.ts","sourceRoot":"","sources":["../../src/managers/messageManager.ts"],"names":[],"mappings":"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"}
@@ -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
- * Process skill content with arguments and bash commands
57
+ * Prepare a skill by name without executing bash commands
58
58
  */
59
- private processSkillContent;
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;IAkBlC;;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;IA4CF;;OAEG;YACW,mBAAmB;IA4BjC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;CAqB5C"}
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(join(skillsPath, entry.name));
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
- // Process skill content with arguments and bash commands
213
- const processedContent = await this.processSkillContent(skill, skillArgs || "");
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 execute skill '${skill_name}':`, error);
253
+ logger?.error(`Failed to prepare skill '${skill_name}':`, error);
225
254
  return {
226
- content: `❌ **Error executing skill**: ${error instanceof Error ? error.message : String(error)}`,
255
+ content: `❌ **Error preparing skill**: ${error instanceof Error ? error.message : String(error)}`,
227
256
  };
228
257
  }
229
258
  }
230
259
  /**
231
- * Process skill content with arguments and bash commands
260
+ * Prepare skill content with arguments but without bash execution
232
261
  */
233
- async processSkillContent(skill, argsString) {
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
- // 3. Parse and execute bash commands (!`command`)
245
- const { commands } = parseBashCommands(mainContent);
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
- mainContent = replaceBashCommandsWithOutput(mainContent, results);
282
+ return replaceBashCommandsWithOutput(content, results);
249
283
  }
250
- return header + description + skillPath + mainContent;
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: skill.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
- this.skillMetadata.set(skill.name, metadata);
282
- this.skillContent.set(skill.name, skill);
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;IAyD3D;;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;IAiD7C;;OAEG;IACI,mBAAmB,IAAI,IAAI;CAInC"}
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
- const result = await this.skillManager.executeSkill({
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
- this.messageManager.addUserMessage({
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
- // Add custom command message to show the command being executed
263
- const originalInput = args
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":"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"}
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