wave-agent-sdk 0.5.0 → 0.6.2
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/agent.d.ts +14 -11
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +64 -151
- package/dist/constants/subagents.d.ts +5 -0
- package/dist/constants/subagents.d.ts.map +1 -0
- package/dist/constants/subagents.js +4 -0
- package/dist/constants/tools.d.ts +4 -1
- package/dist/constants/tools.d.ts.map +1 -1
- package/dist/constants/tools.js +4 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/managers/aiManager.d.ts +2 -5
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +43 -48
- package/dist/managers/backgroundTaskManager.d.ts.map +1 -1
- package/dist/managers/backgroundTaskManager.js +63 -53
- package/dist/managers/foregroundTaskManager.d.ts.map +1 -1
- package/dist/managers/foregroundTaskManager.js +3 -2
- package/dist/managers/mcpManager.d.ts.map +1 -1
- package/dist/managers/messageManager.d.ts +13 -27
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +94 -89
- package/dist/managers/permissionManager.d.ts.map +1 -1
- package/dist/managers/permissionManager.js +25 -15
- package/dist/managers/planManager.d.ts +1 -1
- package/dist/managers/planManager.d.ts.map +1 -1
- package/dist/managers/planManager.js +2 -2
- package/dist/managers/reversionManager.d.ts.map +1 -1
- package/dist/managers/reversionManager.js +23 -2
- package/dist/managers/slashCommandManager.d.ts +3 -0
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +8 -3
- package/dist/managers/subagentManager.d.ts +8 -14
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +46 -112
- package/dist/managers/toolManager.d.ts +11 -0
- package/dist/managers/toolManager.d.ts.map +1 -1
- package/dist/managers/toolManager.js +20 -2
- package/dist/{constants/prompts.d.ts → prompts/index.d.ts} +17 -15
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +309 -0
- package/dist/services/aiService.d.ts +0 -1
- package/dist/services/aiService.d.ts.map +1 -1
- package/dist/services/aiService.js +4 -140
- package/dist/services/memory.d.ts +0 -3
- package/dist/services/memory.d.ts.map +1 -1
- package/dist/services/memory.js +0 -59
- package/dist/services/session.d.ts +15 -1
- package/dist/services/session.d.ts.map +1 -1
- package/dist/services/session.js +57 -1
- package/dist/services/taskManager.d.ts +25 -0
- package/dist/services/taskManager.d.ts.map +1 -0
- package/dist/services/taskManager.js +164 -0
- package/dist/tools/askUserQuestion.d.ts.map +1 -1
- package/dist/tools/askUserQuestion.js +39 -25
- package/dist/tools/bashTool.d.ts.map +1 -1
- package/dist/tools/bashTool.js +13 -11
- package/dist/tools/editTool.d.ts.map +1 -1
- package/dist/tools/editTool.js +2 -1
- package/dist/tools/exitPlanMode.d.ts.map +1 -1
- package/dist/tools/exitPlanMode.js +26 -2
- package/dist/tools/globTool.d.ts.map +1 -1
- package/dist/tools/globTool.js +8 -2
- package/dist/tools/grepTool.d.ts.map +1 -1
- package/dist/tools/grepTool.js +17 -6
- package/dist/tools/lsTool.d.ts.map +1 -1
- package/dist/tools/lsTool.js +3 -1
- package/dist/tools/readTool.d.ts.map +1 -1
- package/dist/tools/readTool.js +16 -1
- package/dist/tools/taskManagementTools.d.ts +6 -0
- package/dist/tools/taskManagementTools.d.ts.map +1 -0
- package/dist/tools/taskManagementTools.js +461 -0
- package/dist/tools/taskOutputTool.d.ts.map +1 -1
- package/dist/tools/taskOutputTool.js +32 -8
- package/dist/tools/taskStopTool.d.ts.map +1 -1
- package/dist/tools/taskStopTool.js +7 -1
- package/dist/tools/taskTool.d.ts.map +1 -1
- package/dist/tools/taskTool.js +37 -2
- package/dist/tools/types.d.ts +11 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/writeTool.d.ts.map +1 -1
- package/dist/tools/writeTool.js +9 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/messaging.d.ts +2 -18
- package/dist/types/messaging.d.ts.map +1 -1
- package/dist/types/processes.d.ts +16 -6
- package/dist/types/processes.d.ts.map +1 -1
- package/dist/types/tasks.d.ts +13 -0
- package/dist/types/tasks.d.ts.map +1 -0
- package/dist/types/tasks.js +1 -0
- package/dist/types/tools.d.ts +4 -1
- package/dist/types/tools.d.ts.map +1 -1
- package/dist/utils/builtinSubagents.d.ts.map +1 -1
- package/dist/utils/builtinSubagents.js +59 -44
- package/dist/utils/cacheControlUtils.d.ts.map +1 -1
- package/dist/utils/cacheControlUtils.js +18 -12
- package/dist/utils/constants.d.ts +0 -4
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +0 -4
- package/dist/utils/convertMessagesForAPI.js +2 -2
- package/dist/utils/editUtils.d.ts.map +1 -1
- package/dist/utils/editUtils.js +2 -2
- package/dist/utils/gitUtils.d.ts +7 -0
- package/dist/utils/gitUtils.d.ts.map +1 -0
- package/dist/utils/gitUtils.js +24 -0
- package/dist/utils/messageOperations.d.ts +3 -58
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/messageOperations.js +4 -146
- package/dist/utils/nameGenerator.d.ts +1 -1
- package/dist/utils/nameGenerator.d.ts.map +1 -1
- package/dist/utils/nameGenerator.js +19 -3
- package/package.json +1 -1
- package/src/agent.ts +86 -183
- package/src/constants/subagents.ts +4 -0
- package/src/constants/tools.ts +4 -1
- package/src/index.ts +1 -0
- package/src/managers/aiManager.ts +63 -70
- package/src/managers/backgroundTaskManager.ts +58 -54
- package/src/managers/foregroundTaskManager.ts +3 -2
- package/src/managers/mcpManager.ts +6 -3
- package/src/managers/messageManager.ts +126 -142
- package/src/managers/permissionManager.ts +32 -21
- package/src/managers/planManager.ts +2 -2
- package/src/managers/reversionManager.ts +26 -2
- package/src/managers/slashCommandManager.ts +12 -3
- package/src/managers/subagentManager.ts +60 -144
- package/src/managers/toolManager.ts +32 -2
- package/src/prompts/index.ts +366 -0
- package/src/services/aiService.ts +3 -145
- package/src/services/memory.ts +0 -72
- package/src/services/session.ts +73 -0
- package/src/services/taskManager.ts +195 -0
- package/src/tools/askUserQuestion.ts +51 -29
- package/src/tools/bashTool.ts +15 -17
- package/src/tools/editTool.ts +3 -1
- package/src/tools/exitPlanMode.ts +27 -3
- package/src/tools/globTool.ts +10 -2
- package/src/tools/grepTool.ts +17 -6
- package/src/tools/lsTool.ts +3 -1
- package/src/tools/readTool.ts +17 -1
- package/src/tools/taskManagementTools.ts +516 -0
- package/src/tools/taskOutputTool.ts +34 -12
- package/src/tools/taskStopTool.ts +7 -1
- package/src/tools/taskTool.ts +45 -1
- package/src/tools/types.ts +12 -0
- package/src/tools/writeTool.ts +9 -2
- package/src/types/index.ts +1 -0
- package/src/types/messaging.ts +1 -21
- package/src/types/processes.ts +18 -7
- package/src/types/tasks.ts +13 -0
- package/src/types/tools.ts +4 -1
- package/src/utils/builtinSubagents.ts +81 -45
- package/src/utils/cacheControlUtils.ts +26 -18
- package/src/utils/constants.ts +0 -5
- package/src/utils/convertMessagesForAPI.ts +2 -2
- package/src/utils/editUtils.ts +2 -6
- package/src/utils/gitUtils.ts +24 -0
- package/src/utils/messageOperations.ts +6 -229
- package/src/utils/nameGenerator.ts +20 -3
- package/dist/constants/prompts.d.ts.map +0 -1
- package/dist/constants/prompts.js +0 -118
- package/dist/tools/todoWriteTool.d.ts +0 -6
- package/dist/tools/todoWriteTool.d.ts.map +0 -1
- package/dist/tools/todoWriteTool.js +0 -220
- package/src/constants/prompts.ts +0 -155
- package/src/tools/todoWriteTool.ts +0 -257
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { addAssistantMessageToMessages, updateToolBlockInMessage, addErrorBlockToMessage, addUserMessageToMessages,
|
|
1
|
+
import { addAssistantMessageToMessages, updateToolBlockInMessage, addErrorBlockToMessage, addUserMessageToMessages, addCommandOutputMessage, updateCommandOutputInMessage, completeCommandInMessage, removeLastUserMessage, } 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";
|
|
@@ -6,9 +6,9 @@ export class MessageManager {
|
|
|
6
6
|
constructor(options) {
|
|
7
7
|
this.filesInContext = new Set(); // Track files mentioned in the conversation
|
|
8
8
|
this.sessionId = generateSessionId();
|
|
9
|
+
this.rootSessionId = this.sessionId;
|
|
9
10
|
this.messages = [];
|
|
10
11
|
this.latestTotalTokens = 0;
|
|
11
|
-
this.userInputHistory = [];
|
|
12
12
|
this.workdir = options.workdir;
|
|
13
13
|
this.encodedWorkdir = pathEncoder.encodeSync(this.workdir); // Cache encoded workdir
|
|
14
14
|
this.callbacks = options.callbacks;
|
|
@@ -24,15 +24,18 @@ export class MessageManager {
|
|
|
24
24
|
getSessionId() {
|
|
25
25
|
return this.sessionId;
|
|
26
26
|
}
|
|
27
|
+
getRootSessionId() {
|
|
28
|
+
return this.rootSessionId;
|
|
29
|
+
}
|
|
30
|
+
getParentSessionId() {
|
|
31
|
+
return this.parentSessionId;
|
|
32
|
+
}
|
|
27
33
|
getMessages() {
|
|
28
34
|
return [...this.messages];
|
|
29
35
|
}
|
|
30
36
|
getlatestTotalTokens() {
|
|
31
37
|
return this.latestTotalTokens;
|
|
32
38
|
}
|
|
33
|
-
getUserInputHistory() {
|
|
34
|
-
return [...this.userInputHistory];
|
|
35
|
-
}
|
|
36
39
|
getWorkdir() {
|
|
37
40
|
return this.workdir;
|
|
38
41
|
}
|
|
@@ -122,7 +125,7 @@ export class MessageManager {
|
|
|
122
125
|
}
|
|
123
126
|
// Use JSONL format for new sessions
|
|
124
127
|
await appendMessages(this.sessionId, unsavedMessages, // Only append new messages
|
|
125
|
-
this.workdir, this.sessionType);
|
|
128
|
+
this.workdir, this.sessionType, this.rootSessionId, this.parentSessionId);
|
|
126
129
|
// Update the saved message count
|
|
127
130
|
this.savedMessageCount = this.messages.length;
|
|
128
131
|
}
|
|
@@ -136,17 +139,13 @@ export class MessageManager {
|
|
|
136
139
|
this.callbacks.onLatestTotalTokensChange?.(latestTotalTokens);
|
|
137
140
|
}
|
|
138
141
|
}
|
|
139
|
-
setUserInputHistory(userInputHistory) {
|
|
140
|
-
this.userInputHistory = [...userInputHistory];
|
|
141
|
-
this.callbacks.onUserInputHistoryChange?.(this.userInputHistory);
|
|
142
|
-
}
|
|
143
142
|
/**
|
|
144
|
-
* Clear messages
|
|
143
|
+
* Clear messages
|
|
145
144
|
*/
|
|
146
145
|
clearMessages() {
|
|
147
146
|
this.setMessages([]);
|
|
148
|
-
this.setUserInputHistory([]);
|
|
149
147
|
this.setSessionId(generateSessionId());
|
|
148
|
+
this.rootSessionId = this.sessionId;
|
|
150
149
|
this.setlatestTotalTokens(0);
|
|
151
150
|
this.savedMessageCount = 0; // Reset saved message count
|
|
152
151
|
}
|
|
@@ -165,29 +164,15 @@ export class MessageManager {
|
|
|
165
164
|
// Initialize state from session data
|
|
166
165
|
initializeFromSession(sessionData) {
|
|
167
166
|
this.setSessionId(sessionData.id);
|
|
167
|
+
this.rootSessionId = sessionData.rootSessionId || sessionData.id;
|
|
168
|
+
this.parentSessionId = sessionData.parentSessionId;
|
|
168
169
|
this.setMessages([...sessionData.messages]);
|
|
169
170
|
this.updateFilesInContext(sessionData.messages);
|
|
170
171
|
this.setlatestTotalTokens(sessionData.metadata.latestTotalTokens);
|
|
171
|
-
// Extract user input history from session messages
|
|
172
|
-
this.setUserInputHistory(extractUserInputHistory(sessionData.messages));
|
|
173
172
|
// Set saved message count to the number of loaded messages since they're already saved
|
|
174
173
|
// This must be done after setSessionId which resets it to 0
|
|
175
174
|
this.savedMessageCount = sessionData.messages.length;
|
|
176
175
|
}
|
|
177
|
-
// Add to input history
|
|
178
|
-
addToInputHistory(input) {
|
|
179
|
-
// Avoid adding duplicate inputs
|
|
180
|
-
if (this.userInputHistory.length > 0 &&
|
|
181
|
-
this.userInputHistory[this.userInputHistory.length - 1] === input) {
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
// Limit history records, keep the latest 100
|
|
185
|
-
this.setUserInputHistory([...this.userInputHistory, input].slice(-100));
|
|
186
|
-
}
|
|
187
|
-
// Clear input history
|
|
188
|
-
clearInputHistory() {
|
|
189
|
-
this.setUserInputHistory([]);
|
|
190
|
-
}
|
|
191
176
|
// Encapsulated message operation functions
|
|
192
177
|
addUserMessage(params) {
|
|
193
178
|
const newMessages = addUserMessageToMessages({
|
|
@@ -236,17 +221,7 @@ export class MessageManager {
|
|
|
236
221
|
updateToolBlock(params) {
|
|
237
222
|
const newMessages = updateToolBlockInMessage({
|
|
238
223
|
messages: this.messages,
|
|
239
|
-
|
|
240
|
-
parameters: params.parameters,
|
|
241
|
-
result: params.result,
|
|
242
|
-
success: params.success,
|
|
243
|
-
error: params.error,
|
|
244
|
-
stage: params.stage,
|
|
245
|
-
name: params.name,
|
|
246
|
-
shortResult: params.shortResult,
|
|
247
|
-
images: params.images,
|
|
248
|
-
compactParams: params.compactParams,
|
|
249
|
-
parametersChunk: params.parametersChunk,
|
|
224
|
+
...params,
|
|
250
225
|
});
|
|
251
226
|
this.setMessages(newMessages);
|
|
252
227
|
this.callbacks.onToolBlockUpdated?.(params);
|
|
@@ -272,10 +247,11 @@ export class MessageManager {
|
|
|
272
247
|
}
|
|
273
248
|
}
|
|
274
249
|
/**
|
|
275
|
-
* Compress messages and update session, delete compressed messages, only keep compressed messages and
|
|
250
|
+
* Compress messages and update session, delete compressed messages, only keep compressed messages and last 3 messages
|
|
276
251
|
*/
|
|
277
|
-
compressMessagesAndUpdateSession(
|
|
278
|
-
|
|
252
|
+
compressMessagesAndUpdateSession(compressedContent, usage) {
|
|
253
|
+
// Get last 3 messages to preserve
|
|
254
|
+
const lastThreeMessages = this.messages.slice(-3);
|
|
279
255
|
// Create compressed message
|
|
280
256
|
const compressMessage = {
|
|
281
257
|
role: "assistant",
|
|
@@ -288,19 +264,20 @@ export class MessageManager {
|
|
|
288
264
|
],
|
|
289
265
|
...(usage && { usage }),
|
|
290
266
|
};
|
|
291
|
-
//
|
|
292
|
-
const
|
|
293
|
-
//
|
|
294
|
-
const
|
|
295
|
-
compressMessage,
|
|
296
|
-
...currentMessages.slice(actualIndex),
|
|
297
|
-
];
|
|
298
|
-
// Update sessionId
|
|
267
|
+
// Build new message array: keep the compressed message and last 3 messages
|
|
268
|
+
const newMessages = [compressMessage, ...lastThreeMessages];
|
|
269
|
+
// Update sessionId and parentSessionId
|
|
270
|
+
const oldSessionId = this.sessionId;
|
|
299
271
|
this.setSessionId(generateSessionId());
|
|
272
|
+
this.parentSessionId = oldSessionId;
|
|
273
|
+
// Trigger task list update if this is the main session to ensure continuity
|
|
274
|
+
if (this.sessionType === "main") {
|
|
275
|
+
this.callbacks.onSessionIdChange?.(this.sessionId);
|
|
276
|
+
}
|
|
300
277
|
// Set new message list
|
|
301
278
|
this.setMessages(newMessages);
|
|
302
|
-
// Trigger compression callback
|
|
303
|
-
this.callbacks.onCompressBlockAdded?.(
|
|
279
|
+
// Trigger compression callback
|
|
280
|
+
this.callbacks.onCompressBlockAdded?.(compressedContent);
|
|
304
281
|
}
|
|
305
282
|
addFileHistoryBlock(snapshots) {
|
|
306
283
|
if (snapshots.length === 0)
|
|
@@ -312,6 +289,7 @@ export class MessageManager {
|
|
|
312
289
|
snapshots,
|
|
313
290
|
});
|
|
314
291
|
this.setMessages([...this.messages]);
|
|
292
|
+
this.callbacks.onFileHistoryBlockAdded?.(snapshots);
|
|
315
293
|
}
|
|
316
294
|
}
|
|
317
295
|
// Bash command related message operations
|
|
@@ -341,33 +319,6 @@ export class MessageManager {
|
|
|
341
319
|
this.setMessages(updatedMessages);
|
|
342
320
|
this.callbacks.onCompleteCommandMessage?.(command, exitCode);
|
|
343
321
|
}
|
|
344
|
-
// Subagent block methods
|
|
345
|
-
addSubagentBlock(subagentId, subagentName, sessionId, configuration, status = "active", parameters, runInBackground) {
|
|
346
|
-
const params = {
|
|
347
|
-
messages: this.messages,
|
|
348
|
-
subagentId,
|
|
349
|
-
subagentName,
|
|
350
|
-
sessionId,
|
|
351
|
-
status,
|
|
352
|
-
configuration,
|
|
353
|
-
runInBackground,
|
|
354
|
-
};
|
|
355
|
-
const updatedMessages = addSubagentBlockToMessage(params);
|
|
356
|
-
this.setMessages(updatedMessages);
|
|
357
|
-
this.callbacks.onSubAgentBlockAdded?.(params.subagentId, parameters);
|
|
358
|
-
}
|
|
359
|
-
updateSubagentBlock(subagentId, updates) {
|
|
360
|
-
const updatedMessages = updateSubagentBlockInMessage(this.messages, subagentId, updates);
|
|
361
|
-
this.setMessages(updatedMessages);
|
|
362
|
-
const params = {
|
|
363
|
-
messages: this.messages,
|
|
364
|
-
subagentId,
|
|
365
|
-
status: updates.status || "active",
|
|
366
|
-
};
|
|
367
|
-
if (updates.status) {
|
|
368
|
-
this.callbacks.onSubAgentBlockUpdated?.(params.subagentId, params.status);
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
322
|
/**
|
|
372
323
|
* Trigger usage change callback with all usage data from assistant messages
|
|
373
324
|
*/
|
|
@@ -460,31 +411,85 @@ export class MessageManager {
|
|
|
460
411
|
const newMessages = removeLastUserMessage(this.messages);
|
|
461
412
|
this.setMessages(newMessages);
|
|
462
413
|
}
|
|
414
|
+
async getFullMessageThread() {
|
|
415
|
+
const { loadFullMessageThread } = await import("../services/session.js");
|
|
416
|
+
return loadFullMessageThread(this.sessionId, this.workdir);
|
|
417
|
+
}
|
|
463
418
|
/**
|
|
464
419
|
* Truncate history to a specific index and revert file changes.
|
|
465
420
|
* @param index - The index of the user message to truncate to.
|
|
466
421
|
* @param reversionManager - Optional ReversionManager to handle file rollbacks.
|
|
467
422
|
*/
|
|
468
423
|
async truncateHistory(index, reversionManager) {
|
|
469
|
-
|
|
424
|
+
const { messages, sessionIds } = await this.getFullMessageThread();
|
|
425
|
+
if (index < 0 || index >= messages.length) {
|
|
470
426
|
throw new Error(`Invalid message index: ${index}`);
|
|
471
427
|
}
|
|
472
|
-
//
|
|
473
|
-
|
|
428
|
+
// Find which session the index belongs to
|
|
429
|
+
let targetSessionId = this.sessionId;
|
|
430
|
+
let targetIndexInSession = index;
|
|
431
|
+
// We need to be careful here because loadFullMessageThread might have removed "compress" blocks
|
|
432
|
+
// Let's re-calculate based on the actual messages returned.
|
|
433
|
+
// Actually, it's easier to just load sessions one by one again or keep track of counts.
|
|
434
|
+
// For simplicity, let's assume we want to truncate the WHOLE thread.
|
|
435
|
+
// If the index is in a previous session, we need to:
|
|
436
|
+
// 1. Load that session.
|
|
437
|
+
// 2. Truncate it.
|
|
438
|
+
// 3. Make it the current session.
|
|
439
|
+
// 4. Delete/Invalidate subsequent sessions.
|
|
440
|
+
// To correctly map 'index' to a session, we need to know the message count of each session
|
|
441
|
+
// as they appear in the concatenated 'messages' array.
|
|
442
|
+
let remainingIndex = index;
|
|
443
|
+
const { loadSessionFromJsonl } = await import("../services/session.js");
|
|
444
|
+
for (const sid of sessionIds) {
|
|
445
|
+
const sessionData = await loadSessionFromJsonl(sid, this.workdir);
|
|
446
|
+
if (!sessionData)
|
|
447
|
+
continue;
|
|
448
|
+
const sessionMessages = sessionData.messages;
|
|
449
|
+
// If this is not the first session in the thread, it might have a compress block at the start
|
|
450
|
+
// that was removed in getFullMessageThread.
|
|
451
|
+
const hasCompressBlock = sessionMessages[0]?.blocks.some((b) => b.type === "compress");
|
|
452
|
+
const effectiveMessages = hasCompressBlock && sid !== sessionIds[0]
|
|
453
|
+
? sessionMessages.slice(1)
|
|
454
|
+
: sessionMessages;
|
|
455
|
+
if (remainingIndex < effectiveMessages.length) {
|
|
456
|
+
targetSessionId = sid;
|
|
457
|
+
targetIndexInSession = hasCompressBlock
|
|
458
|
+
? remainingIndex + 1
|
|
459
|
+
: remainingIndex;
|
|
460
|
+
break;
|
|
461
|
+
}
|
|
462
|
+
remainingIndex -= effectiveMessages.length;
|
|
463
|
+
}
|
|
464
|
+
// Load the target session to perform truncation
|
|
465
|
+
const targetSessionData = await loadSessionFromJsonl(targetSessionId, this.workdir);
|
|
466
|
+
if (!targetSessionData)
|
|
467
|
+
throw new Error(`Target session ${targetSessionId} not found`);
|
|
468
|
+
// Identify messages to be removed (from the whole thread)
|
|
469
|
+
const messagesToRemove = messages.slice(index);
|
|
474
470
|
const messageIdsToRemove = messagesToRemove
|
|
475
471
|
.map((m) => m.id)
|
|
476
472
|
.filter((id) => !!id);
|
|
477
473
|
// Revert file changes if manager is provided
|
|
478
474
|
if (reversionManager && messageIdsToRemove.length > 0) {
|
|
479
|
-
await reversionManager.revertTo(messageIdsToRemove,
|
|
475
|
+
await reversionManager.revertTo(messageIdsToRemove, messages);
|
|
480
476
|
}
|
|
481
|
-
// Truncate messages in
|
|
482
|
-
const
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
477
|
+
// Truncate messages in the target session
|
|
478
|
+
const newMessagesInSession = targetSessionData.messages.slice(0, targetIndexInSession);
|
|
479
|
+
// Update target session file
|
|
480
|
+
this.sessionId = targetSessionId;
|
|
481
|
+
this.rootSessionId = targetSessionData.rootSessionId || targetSessionId;
|
|
482
|
+
this.parentSessionId = targetSessionData.parentSessionId;
|
|
483
|
+
this.transcriptPath = this.computeTranscriptPath();
|
|
484
|
+
await this.rewriteSessionFile(newMessagesInSession);
|
|
485
|
+
// Update in-memory messages to the truncated session messages
|
|
486
|
+
// We do NOT include ancestor messages here to avoid exceeding context limits.
|
|
487
|
+
// The 'compress' block at the start of the session (if any) already summarizes them.
|
|
488
|
+
this.setMessages(newMessagesInSession);
|
|
486
489
|
// Update saved message count
|
|
487
|
-
this.savedMessageCount =
|
|
490
|
+
this.savedMessageCount = newMessagesInSession.length;
|
|
491
|
+
// Notify session ID change if it changed
|
|
492
|
+
this.callbacks.onSessionIdChange?.(this.sessionId);
|
|
488
493
|
}
|
|
489
494
|
/**
|
|
490
495
|
* Rewrite the session file with the current messages.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissionManager.d.ts","sourceRoot":"","sources":["../../src/managers/permissionManager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACf,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAqBhD,MAAM,WAAW,wBAAwB;IACvC,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,qBAAqB,CAAC,EAAE,cAAc,CAAC;IACvC,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,8DAA8D;IAC9D,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,qBAAqB,CAAC,CAAiB;IAC/C,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,qBAAqB,CAAgB;IAC7C,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,6BAA6B,CAAC,CAAiC;gBAE3D,OAAO,GAAE,wBAA6B;IAUlD;;OAEG;IACI,gCAAgC,CACrC,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,GACvC,IAAI;IAIP;;OAEG;IACH,2BAA2B,CAAC,WAAW,CAAC,EAAE,cAAc,GAAG,IAAI;IAyB/D;;OAEG;IACI,eAAe,IAAI,MAAM,EAAE;IAIlC;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAOzC;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAOxC;;OAEG;IACI,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAQ/C;;OAEG;IACI,mBAAmB,IAAI,IAAI;IAKlC;;OAEG;IACH,2BAA2B,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI;IAYxD;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOpC;;OAEG;IACI,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAKtD;;OAEG;IACI,eAAe,IAAI,MAAM,GAAG,SAAS;IAI5C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiCxB;;OAEG;IACH,uBAAuB,CAAC,iBAAiB,CAAC,EAAE,cAAc,GAAG,cAAc;IAI3E;;OAEG;IACH,8BAA8B,CAC5B,iBAAiB,CAAC,EAAE,cAAc,GACjC,cAAc;IAuBjB;;;OAGG;IACG,eAAe,CACnB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"permissionManager.d.ts","sourceRoot":"","sources":["../../src/managers/permissionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -230,31 +230,24 @@ export class PermissionManager {
|
|
|
230
230
|
if (targetPath) {
|
|
231
231
|
const { isInside, resolvedPath } = this.isInsideSafeZone(targetPath, workdir);
|
|
232
232
|
if (!isInside) {
|
|
233
|
-
this.logger?.
|
|
233
|
+
this.logger?.info("File operation outside the Safe Zone in acceptEdits mode, falling back to manual confirmation", {
|
|
234
234
|
toolName: context.toolName,
|
|
235
235
|
targetPath,
|
|
236
236
|
resolvedPath,
|
|
237
237
|
});
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
238
|
+
// Fall through to normal permission check flow to trigger confirmation prompt
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
this.logger?.debug("Permission automatically accepted for tool in acceptEdits mode", {
|
|
242
|
+
toolName: context.toolName,
|
|
243
|
+
});
|
|
244
|
+
return { behavior: "allow" };
|
|
242
245
|
}
|
|
243
246
|
}
|
|
244
|
-
this.logger?.debug("Permission automatically accepted for tool in acceptEdits mode", {
|
|
245
|
-
toolName: context.toolName,
|
|
246
|
-
});
|
|
247
|
-
return { behavior: "allow" };
|
|
248
247
|
}
|
|
249
248
|
}
|
|
250
249
|
// 1.3 If plan mode, allow Read-only tools and Edit/Write for plan file
|
|
251
250
|
if (context.permissionMode === "plan") {
|
|
252
|
-
if (context.toolName === BASH_TOOL_NAME) {
|
|
253
|
-
return {
|
|
254
|
-
behavior: "deny",
|
|
255
|
-
message: "Bash commands are not allowed in plan mode.",
|
|
256
|
-
};
|
|
257
|
-
}
|
|
258
251
|
const writeTools = [
|
|
259
252
|
EDIT_TOOL_NAME,
|
|
260
253
|
MULTI_EDIT_TOOL_NAME,
|
|
@@ -368,6 +361,23 @@ export class PermissionManager {
|
|
|
368
361
|
toolInput,
|
|
369
362
|
suggestedPrefix,
|
|
370
363
|
};
|
|
364
|
+
// Set hidePersistentOption for out-of-bounds file operations
|
|
365
|
+
const fileTools = [
|
|
366
|
+
EDIT_TOOL_NAME,
|
|
367
|
+
MULTI_EDIT_TOOL_NAME,
|
|
368
|
+
DELETE_FILE_TOOL_NAME,
|
|
369
|
+
WRITE_TOOL_NAME,
|
|
370
|
+
];
|
|
371
|
+
if (fileTools.includes(toolName)) {
|
|
372
|
+
const targetPath = (toolInput?.file_path || toolInput?.target_file);
|
|
373
|
+
const workdir = toolInput?.workdir;
|
|
374
|
+
if (targetPath) {
|
|
375
|
+
const { isInside } = this.isInsideSafeZone(targetPath, workdir);
|
|
376
|
+
if (!isInside) {
|
|
377
|
+
context.hidePersistentOption = true;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
371
381
|
// Set hidePersistentOption for dangerous or out-of-bounds bash commands
|
|
372
382
|
if (toolName === BASH_TOOL_NAME && toolInput?.command) {
|
|
373
383
|
const command = String(toolInput.command);
|
|
@@ -9,7 +9,7 @@ export declare class PlanManager {
|
|
|
9
9
|
/**
|
|
10
10
|
* Ensures the plan directory exists and generates a new plan file path with a random name
|
|
11
11
|
*/
|
|
12
|
-
getOrGeneratePlanFilePath(): Promise<{
|
|
12
|
+
getOrGeneratePlanFilePath(seed?: string): Promise<{
|
|
13
13
|
path: string;
|
|
14
14
|
name: string;
|
|
15
15
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planManager.d.ts","sourceRoot":"","sources":["../../src/managers/planManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;GAEG;AACH,qBAAa,WAAW;IAGV,OAAO,CAAC,MAAM,CAAC;IAF3B,OAAO,CAAC,OAAO,CAAS;gBAEJ,MAAM,CAAC,EAAE,MAAM,YAAA;IAInC;;OAEG;IACU,yBAAyB,IAAI,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"planManager.d.ts","sourceRoot":"","sources":["../../src/managers/planManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;GAEG;AACH,qBAAa,WAAW;IAGV,OAAO,CAAC,MAAM,CAAC;IAF3B,OAAO,CAAC,OAAO,CAAS;gBAEJ,MAAM,CAAC,EAAE,MAAM,YAAA;IAInC;;OAEG;IACU,yBAAyB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAC7D,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IAgBF;;OAEG;IACI,UAAU,IAAI,MAAM;CAG5B"}
|
|
@@ -13,7 +13,7 @@ export class PlanManager {
|
|
|
13
13
|
/**
|
|
14
14
|
* Ensures the plan directory exists and generates a new plan file path with a random name
|
|
15
15
|
*/
|
|
16
|
-
async getOrGeneratePlanFilePath() {
|
|
16
|
+
async getOrGeneratePlanFilePath(seed) {
|
|
17
17
|
try {
|
|
18
18
|
await fs.mkdir(this.planDir, { recursive: true });
|
|
19
19
|
}
|
|
@@ -21,7 +21,7 @@ export class PlanManager {
|
|
|
21
21
|
this.logger?.error(`Failed to create plan directory: ${this.planDir}`, error);
|
|
22
22
|
throw error;
|
|
23
23
|
}
|
|
24
|
-
const name = generateRandomName();
|
|
24
|
+
const name = generateRandomName(seed);
|
|
25
25
|
const filePath = path.join(this.planDir, `${name}.md`);
|
|
26
26
|
this.logger?.info(`Generated plan file path: ${filePath}`);
|
|
27
27
|
return { path: filePath, name };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reversionManager.d.ts","sourceRoot":"","sources":["../../src/managers/reversionManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,gBAAgB,EAAE,gBAAgB;IAI9C;;;OAGG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GACxC,OAAO,CAAC,MAAM,CAAC;IAuBlB;;;OAGG;IACG,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GACxC,OAAO,CAAC,MAAM,CAAC;IAIlB;;;OAGG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBvD,OAAO,CAAC,kBAAkB,CAAsB;IAEhD;;OAEG;IACH,6BAA6B,IAAI,YAAY,EAAE;IAM/C;;;OAGG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIzC;;;;OAIG;IACG,QAAQ,CACZ,UAAU,EAAE,MAAM,EAAE,EACpB,WAAW,EAAE,OAAO,mBAAmB,EAAE,OAAO,EAAE,GACjD,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"reversionManager.d.ts","sourceRoot":"","sources":["../../src/managers/reversionManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,gBAAgB,EAAE,gBAAgB;IAI9C;;;OAGG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GACxC,OAAO,CAAC,MAAM,CAAC;IAuBlB;;;OAGG;IACG,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GACxC,OAAO,CAAC,MAAM,CAAC;IAIlB;;;OAGG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBvD,OAAO,CAAC,kBAAkB,CAAsB;IAEhD;;OAEG;IACH,6BAA6B,IAAI,YAAY,EAAE;IAM/C;;;OAGG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIzC;;;;OAIG;IACG,QAAQ,CACZ,UAAU,EAAE,MAAM,EAAE,EACpB,WAAW,EAAE,OAAO,mBAAmB,EAAE,OAAO,EAAE,GACjD,OAAO,CAAC,MAAM,CAAC;CAqEnB"}
|
|
@@ -89,10 +89,15 @@ export class ReversionManager {
|
|
|
89
89
|
// Revert in reverse chronological order (LIFO)
|
|
90
90
|
const sortedSnapshots = snapshots.sort((a, b) => b.timestamp - a.timestamp);
|
|
91
91
|
let revertedCount = 0;
|
|
92
|
+
const affectedTaskListIds = new Set();
|
|
92
93
|
for (const snapshot of sortedSnapshots) {
|
|
93
94
|
try {
|
|
94
|
-
if (
|
|
95
|
-
//
|
|
95
|
+
if (snapshot.operation === "create") {
|
|
96
|
+
// For 'create' operations, we should hard delete the file upon reversion
|
|
97
|
+
await fs.rm(snapshot.filePath, { force: true });
|
|
98
|
+
}
|
|
99
|
+
else if (!snapshot.snapshotPath) {
|
|
100
|
+
// Fallback for older snapshots or if snapshotPath is missing
|
|
96
101
|
await fs.rm(snapshot.filePath, { force: true });
|
|
97
102
|
}
|
|
98
103
|
else {
|
|
@@ -107,12 +112,28 @@ export class ReversionManager {
|
|
|
107
112
|
await fs.rm(snapshot.filePath, { force: true });
|
|
108
113
|
}
|
|
109
114
|
}
|
|
115
|
+
// Check if this is a task file and track the task list ID
|
|
116
|
+
if (snapshot.filePath.includes("/.wave/tasks/")) {
|
|
117
|
+
const parts = snapshot.filePath.split("/.wave/tasks/");
|
|
118
|
+
if (parts.length > 1) {
|
|
119
|
+
const taskListId = parts[1].split("/")[0];
|
|
120
|
+
if (taskListId) {
|
|
121
|
+
affectedTaskListIds.add(taskListId);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
110
125
|
revertedCount++;
|
|
111
126
|
}
|
|
112
127
|
catch (error) {
|
|
113
128
|
console.error(`Failed to revert file ${snapshot.filePath}:`, error);
|
|
114
129
|
}
|
|
115
130
|
}
|
|
131
|
+
// Notify TaskManager if any task lists were affected
|
|
132
|
+
// Note: In the current architecture, TaskManager is managed by Agent and
|
|
133
|
+
// listens for file changes if it's a foreground process, or we might need
|
|
134
|
+
// to explicitly trigger a refresh. Since ReversionManager doesn't have
|
|
135
|
+
// a direct reference to TaskManager, we rely on the fact that TaskManager
|
|
136
|
+
// will see the file system changes or be refreshed by the Agent/UI.
|
|
116
137
|
return revertedCount;
|
|
117
138
|
}
|
|
118
139
|
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import type { MessageManager } from "./messageManager.js";
|
|
2
2
|
import type { AIManager } from "./aiManager.js";
|
|
3
3
|
import type { BackgroundTaskManager } from "./backgroundTaskManager.js";
|
|
4
|
+
import type { TaskManager } from "../services/taskManager.js";
|
|
4
5
|
import type { SlashCommand, CustomSlashCommand, Logger } from "../types/index.js";
|
|
5
6
|
export interface SlashCommandManagerOptions {
|
|
6
7
|
messageManager: MessageManager;
|
|
7
8
|
aiManager: AIManager;
|
|
8
9
|
backgroundTaskManager: BackgroundTaskManager;
|
|
10
|
+
taskManager: TaskManager;
|
|
9
11
|
workdir: string;
|
|
10
12
|
logger?: Logger;
|
|
11
13
|
}
|
|
@@ -15,6 +17,7 @@ export declare class SlashCommandManager {
|
|
|
15
17
|
private messageManager;
|
|
16
18
|
private aiManager;
|
|
17
19
|
private backgroundTaskManager;
|
|
20
|
+
private taskManager;
|
|
18
21
|
private workdir;
|
|
19
22
|
private logger?;
|
|
20
23
|
constructor(options: SlashCommandManagerOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slashCommandManager.d.ts","sourceRoot":"","sources":["../../src/managers/slashCommandManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,MAAM,EACP,MAAM,mBAAmB,CAAC;AAmB3B,MAAM,WAAW,0BAA0B;IACzC,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,OAAO,EAAE,0BAA0B;
|
|
1
|
+
{"version":3,"file":"slashCommandManager.d.ts","sourceRoot":"","sources":["../../src/managers/slashCommandManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,MAAM,EACP,MAAM,mBAAmB,CAAC;AAmB3B,MAAM,WAAW,0BAA0B;IACzC,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,OAAO,EAAE,0BAA0B;IAY/C,OAAO,CAAC,yBAAyB;IAsCjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAyD1B;;OAEG;IACI,sBAAsB,CAC3B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,kBAAkB,EAAE,GAC7B,IAAI;IAwDP;;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;IA0E7C;;OAEG;IACI,mBAAmB,IAAI,IAAI;CAInC"}
|
|
@@ -3,7 +3,7 @@ import { substituteCommandParameters, parseSlashCommandInput, hasParameterPlaceh
|
|
|
3
3
|
import { parseBashCommands, replaceBashCommandsWithOutput, } from "../utils/markdownParser.js";
|
|
4
4
|
import { exec } from "child_process";
|
|
5
5
|
import { promisify } from "util";
|
|
6
|
-
import { INIT_PROMPT } from "../
|
|
6
|
+
import { INIT_PROMPT } from "../prompts/index.js";
|
|
7
7
|
const execAsync = promisify(exec);
|
|
8
8
|
export class SlashCommandManager {
|
|
9
9
|
constructor(options) {
|
|
@@ -12,6 +12,7 @@ export class SlashCommandManager {
|
|
|
12
12
|
this.messageManager = options.messageManager;
|
|
13
13
|
this.aiManager = options.aiManager;
|
|
14
14
|
this.backgroundTaskManager = options.backgroundTaskManager;
|
|
15
|
+
this.taskManager = options.taskManager;
|
|
15
16
|
this.workdir = options.workdir;
|
|
16
17
|
this.logger = options.logger;
|
|
17
18
|
this.initializeBuiltinCommands();
|
|
@@ -26,8 +27,12 @@ export class SlashCommandManager {
|
|
|
26
27
|
handler: () => {
|
|
27
28
|
// Clear chat messages
|
|
28
29
|
this.messageManager.clearMessages();
|
|
29
|
-
//
|
|
30
|
-
process.
|
|
30
|
+
// Reset task list if WAVE_TASK_LIST_ID is not set
|
|
31
|
+
if (!process.env.WAVE_TASK_LIST_ID) {
|
|
32
|
+
const newTaskListId = this.messageManager.getRootSessionId();
|
|
33
|
+
this.taskManager.setTaskListId(newTaskListId);
|
|
34
|
+
this.taskManager.emit("tasksChange", newTaskListId);
|
|
35
|
+
}
|
|
31
36
|
},
|
|
32
37
|
});
|
|
33
38
|
// Register built-in init command
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import type { MemoryRuleManager } from "./MemoryRuleManager.js";
|
|
2
2
|
import type { SubagentConfiguration } from "../utils/subagentParser.js";
|
|
3
3
|
import type { Message, Logger, GatewayConfig, ModelConfig, Usage } from "../types/index.js";
|
|
4
|
-
import type { SessionData } from "../services/session.js";
|
|
5
4
|
import { AIManager } from "./aiManager.js";
|
|
6
5
|
import { MessageManager } from "./messageManager.js";
|
|
7
6
|
import { ToolManager } from "./toolManager.js";
|
|
8
7
|
import { HookManager } from "./hookManager.js";
|
|
9
|
-
import { UserMessageParams, type AgentToolBlockUpdateParams } from "../utils/messageOperations.js";
|
|
10
8
|
import { BackgroundTaskManager } from "./backgroundTaskManager.js";
|
|
9
|
+
import { UserMessageParams, type AgentToolBlockUpdateParams } from "../utils/messageOperations.js";
|
|
11
10
|
export interface SubagentManagerCallbacks {
|
|
12
11
|
/** Triggered when subagent adds user message */
|
|
13
12
|
onSubagentUserMessageAdded?: (subagentId: string, params: UserMessageParams) => void;
|
|
@@ -21,6 +20,8 @@ export interface SubagentManagerCallbacks {
|
|
|
21
20
|
onSubagentToolBlockUpdated?: (subagentId: string, params: AgentToolBlockUpdateParams) => void;
|
|
22
21
|
/** Triggered when subagent messages change */
|
|
23
22
|
onSubagentMessagesChange?: (subagentId: string, messages: Message[]) => void;
|
|
23
|
+
/** Triggered when subagent latest total tokens change */
|
|
24
|
+
onSubagentLatestTotalTokensChange?: (subagentId: string, tokens: number) => void;
|
|
24
25
|
}
|
|
25
26
|
export interface SubagentInstance {
|
|
26
27
|
subagentId: string;
|
|
@@ -30,13 +31,15 @@ export interface SubagentInstance {
|
|
|
30
31
|
toolManager: ToolManager;
|
|
31
32
|
status: "initializing" | "active" | "completed" | "error" | "aborted";
|
|
32
33
|
messages: Message[];
|
|
34
|
+
lastTools: string[];
|
|
33
35
|
subagentType: string;
|
|
34
36
|
backgroundTaskId?: string;
|
|
37
|
+
onUpdate?: () => void;
|
|
35
38
|
}
|
|
36
39
|
export interface SubagentManagerOptions {
|
|
37
40
|
workdir: string;
|
|
38
41
|
parentToolManager: ToolManager;
|
|
39
|
-
|
|
42
|
+
taskManager: import("../services/taskManager.js").TaskManager;
|
|
40
43
|
callbacks?: SubagentManagerCallbacks;
|
|
41
44
|
logger?: Logger;
|
|
42
45
|
getGatewayConfig: () => GatewayConfig;
|
|
@@ -53,7 +56,7 @@ export declare class SubagentManager {
|
|
|
53
56
|
private cachedConfigurations;
|
|
54
57
|
private workdir;
|
|
55
58
|
private parentToolManager;
|
|
56
|
-
private
|
|
59
|
+
private taskManager;
|
|
57
60
|
private callbacks?;
|
|
58
61
|
private logger?;
|
|
59
62
|
private getGatewayConfig;
|
|
@@ -88,7 +91,7 @@ export declare class SubagentManager {
|
|
|
88
91
|
description: string;
|
|
89
92
|
prompt: string;
|
|
90
93
|
subagent_type: string;
|
|
91
|
-
}, runInBackground?: boolean): Promise<SubagentInstance>;
|
|
94
|
+
}, runInBackground?: boolean, onUpdate?: () => void): Promise<SubagentInstance>;
|
|
92
95
|
/**
|
|
93
96
|
* Execute task using subagent instance
|
|
94
97
|
*
|
|
@@ -122,15 +125,6 @@ export declare class SubagentManager {
|
|
|
122
125
|
* Clean up all instances (for session end)
|
|
123
126
|
*/
|
|
124
127
|
cleanup(): void;
|
|
125
|
-
/**
|
|
126
|
-
* Restore subagent instances from saved session data
|
|
127
|
-
* This method is called during agent initialization to restore previous subagent states
|
|
128
|
-
*/
|
|
129
|
-
restoreSubagentSessions(subagentSessions: Array<{
|
|
130
|
-
sessionData: SessionData;
|
|
131
|
-
subagentId: string;
|
|
132
|
-
configuration: SubagentConfiguration;
|
|
133
|
-
}>): Promise<void>;
|
|
134
128
|
/**
|
|
135
129
|
* Create subagent callbacks for a specific subagent ID
|
|
136
130
|
* Extracted to reuse in both create and restore flows
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagentManager.d.ts","sourceRoot":"","sources":["../../src/managers/subagentManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACN,aAAa,EACb,WAAW,EACX,KAAK,EACN,MAAM,mBAAmB,CAAC;AAC3B,OAAO,
|
|
1
|
+
{"version":3,"file":"subagentManager.d.ts","sourceRoot":"","sources":["../../src/managers/subagentManager.ts"],"names":[],"mappings":"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"}
|