wave-agent-sdk 0.2.1 → 0.5.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/agent.d.ts +66 -20
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +156 -83
- package/dist/constants/prompts.d.ts +7 -2
- package/dist/constants/prompts.d.ts.map +1 -1
- package/dist/constants/prompts.js +41 -5
- package/dist/constants/tools.d.ts +2 -2
- package/dist/constants/tools.js +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/managers/MemoryRuleManager.d.ts.map +1 -1
- package/dist/managers/MemoryRuleManager.js +16 -2
- package/dist/managers/aiManager.d.ts +14 -4
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +61 -9
- package/dist/managers/backgroundBashManager.d.ts.map +1 -1
- package/dist/managers/backgroundBashManager.js +1 -0
- package/dist/managers/backgroundTaskManager.d.ts +35 -0
- package/dist/managers/backgroundTaskManager.d.ts.map +1 -0
- package/dist/managers/backgroundTaskManager.js +249 -0
- package/dist/managers/bashManager.d.ts.map +1 -1
- package/dist/managers/bashManager.js +0 -3
- package/dist/managers/foregroundTaskManager.d.ts +9 -0
- package/dist/managers/foregroundTaskManager.d.ts.map +1 -0
- package/dist/managers/foregroundTaskManager.js +20 -0
- package/dist/managers/liveConfigManager.d.ts +1 -1
- package/dist/managers/liveConfigManager.d.ts.map +1 -1
- package/dist/managers/lspManager.d.ts.map +1 -1
- package/dist/managers/lspManager.js +3 -1
- package/dist/managers/messageManager.d.ts +34 -4
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +104 -13
- package/dist/managers/permissionManager.d.ts.map +1 -1
- package/dist/managers/permissionManager.js +11 -13
- package/dist/managers/pluginManager.d.ts.map +1 -1
- package/dist/managers/pluginManager.js +3 -2
- package/dist/managers/pluginScopeManager.d.ts +13 -2
- package/dist/managers/pluginScopeManager.d.ts.map +1 -1
- package/dist/managers/pluginScopeManager.js +38 -0
- package/dist/managers/reversionManager.d.ts +39 -0
- package/dist/managers/reversionManager.d.ts.map +1 -0
- package/dist/managers/reversionManager.js +118 -0
- package/dist/managers/slashCommandManager.d.ts +4 -1
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +16 -6
- package/dist/managers/subagentManager.d.ts +13 -2
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +144 -35
- package/dist/managers/toolManager.d.ts +11 -1
- package/dist/managers/toolManager.d.ts.map +1 -1
- package/dist/managers/toolManager.js +11 -3
- package/dist/services/GitService.d.ts.map +1 -1
- package/dist/services/GitService.js +6 -2
- package/dist/services/MarketplaceService.d.ts +14 -1
- package/dist/services/MarketplaceService.d.ts.map +1 -1
- package/dist/services/MarketplaceService.js +72 -4
- package/dist/services/MemoryRuleService.d.ts +1 -1
- package/dist/services/MemoryRuleService.d.ts.map +1 -1
- package/dist/services/MemoryRuleService.js +13 -2
- package/dist/services/aiService.js +1 -1
- package/dist/services/configurationService.d.ts +18 -2
- package/dist/services/configurationService.d.ts.map +1 -1
- package/dist/services/configurationService.js +62 -0
- package/dist/services/fileWatcher.d.ts +0 -5
- package/dist/services/fileWatcher.d.ts.map +1 -1
- package/dist/services/fileWatcher.js +0 -11
- package/dist/services/memory.js +1 -1
- package/dist/services/pluginLoader.d.ts.map +1 -1
- package/dist/services/pluginLoader.js +6 -1
- package/dist/services/reversionService.d.ts +24 -0
- package/dist/services/reversionService.d.ts.map +1 -0
- package/dist/services/reversionService.js +76 -0
- package/dist/services/session.d.ts +7 -0
- package/dist/services/session.d.ts.map +1 -1
- package/dist/services/session.js +126 -3
- package/dist/tools/bashTool.d.ts +0 -8
- package/dist/tools/bashTool.d.ts.map +1 -1
- package/dist/tools/bashTool.js +52 -174
- package/dist/tools/deleteFileTool.d.ts.map +1 -1
- package/dist/tools/deleteFileTool.js +9 -0
- package/dist/tools/editTool.d.ts.map +1 -1
- package/dist/tools/editTool.js +15 -4
- package/dist/tools/multiEditTool.d.ts.map +1 -1
- package/dist/tools/multiEditTool.js +16 -5
- package/dist/tools/taskOutputTool.d.ts +3 -0
- package/dist/tools/taskOutputTool.d.ts.map +1 -0
- package/dist/tools/taskOutputTool.js +149 -0
- package/dist/tools/taskStopTool.d.ts +3 -0
- package/dist/tools/taskStopTool.d.ts.map +1 -0
- package/dist/tools/taskStopTool.js +65 -0
- package/dist/tools/taskTool.d.ts.map +1 -1
- package/dist/tools/taskTool.js +105 -63
- package/dist/tools/types.d.ts +7 -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 -0
- package/dist/types/commands.d.ts +1 -0
- package/dist/types/commands.d.ts.map +1 -1
- package/dist/types/configuration.d.ts +3 -0
- package/dist/types/configuration.d.ts.map +1 -1
- package/dist/types/environment.d.ts +2 -1
- package/dist/types/environment.d.ts.map +1 -1
- package/dist/types/environment.js +0 -6
- package/dist/types/history.d.ts +5 -0
- package/dist/types/history.d.ts.map +1 -0
- package/dist/types/history.js +1 -0
- 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/marketplace.d.ts +4 -0
- package/dist/types/marketplace.d.ts.map +1 -1
- package/dist/types/messaging.d.ts +7 -1
- package/dist/types/messaging.d.ts.map +1 -1
- package/dist/types/processes.d.ts +24 -4
- package/dist/types/processes.d.ts.map +1 -1
- package/dist/types/reversion.d.ts +29 -0
- package/dist/types/reversion.d.ts.map +1 -0
- package/dist/types/reversion.js +1 -0
- package/dist/utils/builtinSubagents.d.ts.map +1 -1
- package/dist/utils/builtinSubagents.js +16 -0
- package/dist/utils/constants.d.ts +2 -2
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +2 -2
- package/dist/utils/editUtils.d.ts +4 -9
- package/dist/utils/editUtils.d.ts.map +1 -1
- package/dist/utils/editUtils.js +54 -55
- package/dist/utils/messageOperations.d.ts +3 -1
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/messageOperations.js +8 -1
- package/dist/utils/openaiClient.d.ts.map +1 -1
- package/dist/utils/openaiClient.js +56 -26
- package/dist/utils/promptHistory.d.ts +20 -0
- package/dist/utils/promptHistory.d.ts.map +1 -0
- package/dist/utils/promptHistory.js +117 -0
- package/package.json +5 -3
- package/src/agent.ts +193 -109
- package/src/constants/prompts.ts +45 -5
- package/src/constants/tools.ts +2 -2
- package/src/index.ts +1 -1
- package/src/managers/MemoryRuleManager.ts +18 -2
- package/src/managers/aiManager.ts +87 -18
- package/src/managers/backgroundBashManager.ts +1 -0
- package/src/managers/backgroundTaskManager.ts +306 -0
- package/src/managers/bashManager.ts +0 -4
- package/src/managers/foregroundTaskManager.ts +26 -0
- package/src/managers/liveConfigManager.ts +2 -1
- package/src/managers/lspManager.ts +3 -1
- package/src/managers/messageManager.ts +136 -18
- package/src/managers/permissionManager.ts +11 -13
- package/src/managers/pluginManager.ts +4 -3
- package/src/managers/pluginScopeManager.ts +57 -8
- package/src/managers/reversionManager.ts +152 -0
- package/src/managers/slashCommandManager.ts +30 -7
- package/src/managers/subagentManager.ts +176 -31
- package/src/managers/toolManager.ts +23 -4
- package/src/services/GitService.ts +6 -2
- package/src/services/MarketplaceService.ts +100 -4
- package/src/services/MemoryRuleService.ts +18 -6
- package/src/services/aiService.ts +1 -1
- package/src/services/configurationService.ts +79 -1
- package/src/services/fileWatcher.ts +0 -13
- package/src/services/memory.ts +1 -1
- package/src/services/pluginLoader.ts +7 -1
- package/src/services/reversionService.ts +94 -0
- package/src/services/session.ts +161 -3
- package/src/tools/bashTool.ts +73 -200
- package/src/tools/deleteFileTool.ts +15 -0
- package/src/tools/editTool.ts +20 -10
- package/src/tools/multiEditTool.ts +21 -11
- package/src/tools/taskOutputTool.ts +174 -0
- package/src/tools/taskStopTool.ts +72 -0
- package/src/tools/taskTool.ts +130 -74
- package/src/tools/types.ts +7 -0
- package/src/tools/writeTool.ts +14 -0
- package/src/types/commands.ts +3 -0
- package/src/types/configuration.ts +4 -0
- package/src/types/environment.ts +3 -1
- package/src/types/history.ts +4 -0
- package/src/types/index.ts +1 -0
- package/src/types/marketplace.ts +5 -0
- package/src/types/messaging.ts +9 -1
- package/src/types/processes.ts +33 -4
- package/src/types/reversion.ts +29 -0
- package/src/utils/builtinSubagents.ts +18 -0
- package/src/utils/constants.ts +2 -2
- package/src/utils/editUtils.ts +66 -58
- package/src/utils/messageOperations.ts +10 -0
- package/src/utils/openaiClient.ts +69 -35
- package/src/utils/promptHistory.ts +133 -0
- package/dist/utils/bashHistory.d.ts +0 -50
- package/dist/utils/bashHistory.d.ts.map +0 -1
- package/dist/utils/bashHistory.js +0 -256
- package/src/utils/bashHistory.ts +0 -320
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { spawn } from "child_process";
|
|
2
|
+
import { stripAnsiColors } from "../utils/stringUtils.js";
|
|
3
|
+
import { logger } from "../utils/globalLogger.js";
|
|
4
|
+
export class BackgroundTaskManager {
|
|
5
|
+
constructor(options) {
|
|
6
|
+
this.tasks = new Map();
|
|
7
|
+
this.nextId = 1;
|
|
8
|
+
this.callbacks = options.callbacks || {};
|
|
9
|
+
this.workdir = options.workdir;
|
|
10
|
+
}
|
|
11
|
+
notifyTasksChange() {
|
|
12
|
+
this.callbacks.onTasksChange?.(Array.from(this.tasks.values()));
|
|
13
|
+
}
|
|
14
|
+
generateId() {
|
|
15
|
+
return `task_${this.nextId++}`;
|
|
16
|
+
}
|
|
17
|
+
addTask(task) {
|
|
18
|
+
this.tasks.set(task.id, task);
|
|
19
|
+
this.notifyTasksChange();
|
|
20
|
+
}
|
|
21
|
+
getTask(id) {
|
|
22
|
+
return this.tasks.get(id);
|
|
23
|
+
}
|
|
24
|
+
getAllTasks() {
|
|
25
|
+
return Array.from(this.tasks.values());
|
|
26
|
+
}
|
|
27
|
+
startShell(command, timeout) {
|
|
28
|
+
const id = this.generateId();
|
|
29
|
+
const startTime = Date.now();
|
|
30
|
+
const child = spawn(command, {
|
|
31
|
+
shell: true,
|
|
32
|
+
stdio: "pipe",
|
|
33
|
+
cwd: this.workdir,
|
|
34
|
+
env: {
|
|
35
|
+
...process.env,
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
const shell = {
|
|
39
|
+
id,
|
|
40
|
+
type: "shell",
|
|
41
|
+
process: child,
|
|
42
|
+
command,
|
|
43
|
+
startTime,
|
|
44
|
+
status: "running",
|
|
45
|
+
stdout: "",
|
|
46
|
+
stderr: "",
|
|
47
|
+
};
|
|
48
|
+
this.tasks.set(id, shell);
|
|
49
|
+
this.notifyTasksChange();
|
|
50
|
+
// Set up timeout if specified
|
|
51
|
+
let timeoutHandle;
|
|
52
|
+
if (timeout && timeout > 0) {
|
|
53
|
+
timeoutHandle = setTimeout(() => {
|
|
54
|
+
if (shell.status === "running") {
|
|
55
|
+
this.stopTask(id);
|
|
56
|
+
}
|
|
57
|
+
}, timeout);
|
|
58
|
+
}
|
|
59
|
+
const onStdout = (data) => {
|
|
60
|
+
shell.stdout += stripAnsiColors(data.toString());
|
|
61
|
+
this.notifyTasksChange();
|
|
62
|
+
};
|
|
63
|
+
const onStderr = (data) => {
|
|
64
|
+
shell.stderr += stripAnsiColors(data.toString());
|
|
65
|
+
this.notifyTasksChange();
|
|
66
|
+
};
|
|
67
|
+
const onExit = (code) => {
|
|
68
|
+
if (timeoutHandle) {
|
|
69
|
+
clearTimeout(timeoutHandle);
|
|
70
|
+
}
|
|
71
|
+
shell.status = code === 0 ? "completed" : "failed";
|
|
72
|
+
shell.exitCode = code ?? 0;
|
|
73
|
+
shell.endTime = Date.now();
|
|
74
|
+
shell.runtime = shell.endTime - startTime;
|
|
75
|
+
this.notifyTasksChange();
|
|
76
|
+
};
|
|
77
|
+
const onError = (error) => {
|
|
78
|
+
if (timeoutHandle) {
|
|
79
|
+
clearTimeout(timeoutHandle);
|
|
80
|
+
}
|
|
81
|
+
shell.status = "failed";
|
|
82
|
+
shell.stderr += `\nProcess error: ${stripAnsiColors(error.message)}`;
|
|
83
|
+
shell.exitCode = 1;
|
|
84
|
+
shell.endTime = Date.now();
|
|
85
|
+
shell.runtime = shell.endTime - startTime;
|
|
86
|
+
this.notifyTasksChange();
|
|
87
|
+
};
|
|
88
|
+
child.stdout?.on("data", onStdout);
|
|
89
|
+
child.stderr?.on("data", onStderr);
|
|
90
|
+
child.on("exit", onExit);
|
|
91
|
+
child.on("error", onError);
|
|
92
|
+
const detach = () => {
|
|
93
|
+
child.stdout?.off("data", onStdout);
|
|
94
|
+
child.stderr?.off("data", onStderr);
|
|
95
|
+
child.off("exit", onExit);
|
|
96
|
+
child.off("error", onError);
|
|
97
|
+
if (timeoutHandle) {
|
|
98
|
+
clearTimeout(timeoutHandle);
|
|
99
|
+
}
|
|
100
|
+
this.tasks.delete(id);
|
|
101
|
+
this.notifyTasksChange();
|
|
102
|
+
};
|
|
103
|
+
return { id, child, detach };
|
|
104
|
+
}
|
|
105
|
+
adoptProcess(child, command, initialStdout = "", initialStderr = "") {
|
|
106
|
+
const id = this.generateId();
|
|
107
|
+
const startTime = Date.now();
|
|
108
|
+
const shell = {
|
|
109
|
+
id,
|
|
110
|
+
type: "shell",
|
|
111
|
+
process: child,
|
|
112
|
+
command,
|
|
113
|
+
startTime,
|
|
114
|
+
status: "running",
|
|
115
|
+
stdout: initialStdout,
|
|
116
|
+
stderr: initialStderr,
|
|
117
|
+
};
|
|
118
|
+
this.tasks.set(id, shell);
|
|
119
|
+
this.notifyTasksChange();
|
|
120
|
+
child.stdout?.on("data", (data) => {
|
|
121
|
+
shell.stdout += stripAnsiColors(data.toString());
|
|
122
|
+
this.notifyTasksChange();
|
|
123
|
+
});
|
|
124
|
+
child.stderr?.on("data", (data) => {
|
|
125
|
+
shell.stderr += stripAnsiColors(data.toString());
|
|
126
|
+
this.notifyTasksChange();
|
|
127
|
+
});
|
|
128
|
+
child.on("exit", (code) => {
|
|
129
|
+
shell.status = code === 0 ? "completed" : "failed";
|
|
130
|
+
shell.exitCode = code ?? 0;
|
|
131
|
+
shell.endTime = Date.now();
|
|
132
|
+
shell.runtime = shell.endTime - startTime;
|
|
133
|
+
this.notifyTasksChange();
|
|
134
|
+
});
|
|
135
|
+
child.on("error", (error) => {
|
|
136
|
+
shell.status = "failed";
|
|
137
|
+
shell.stderr += `\nProcess error: ${stripAnsiColors(error.message)}`;
|
|
138
|
+
shell.exitCode = 1;
|
|
139
|
+
shell.endTime = Date.now();
|
|
140
|
+
shell.runtime = shell.endTime - startTime;
|
|
141
|
+
this.notifyTasksChange();
|
|
142
|
+
});
|
|
143
|
+
return id;
|
|
144
|
+
}
|
|
145
|
+
getOutput(id, filter) {
|
|
146
|
+
const task = this.tasks.get(id);
|
|
147
|
+
if (!task) {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
let stdout = task.stdout;
|
|
151
|
+
let stderr = task.stderr;
|
|
152
|
+
// Apply regex filter if provided
|
|
153
|
+
if (filter) {
|
|
154
|
+
try {
|
|
155
|
+
const regex = new RegExp(filter);
|
|
156
|
+
stdout = stdout
|
|
157
|
+
.split("\n")
|
|
158
|
+
.filter((line) => regex.test(line))
|
|
159
|
+
.join("\n");
|
|
160
|
+
stderr = stderr
|
|
161
|
+
.split("\n")
|
|
162
|
+
.filter((line) => regex.test(line))
|
|
163
|
+
.join("\n");
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
logger.warn(`Invalid filter regex: ${filter}`, error);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
stdout,
|
|
171
|
+
stderr,
|
|
172
|
+
status: task.status,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
stopTask(id) {
|
|
176
|
+
const task = this.tasks.get(id);
|
|
177
|
+
if (!task || task.status !== "running") {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
if (task.type === "shell") {
|
|
181
|
+
const shell = task;
|
|
182
|
+
try {
|
|
183
|
+
// Try to kill process group first
|
|
184
|
+
if (shell.process.pid) {
|
|
185
|
+
process.kill(-shell.process.pid, "SIGTERM");
|
|
186
|
+
// Force kill after timeout
|
|
187
|
+
setTimeout(() => {
|
|
188
|
+
if (shell.status === "running" &&
|
|
189
|
+
shell.process.pid &&
|
|
190
|
+
!shell.process.killed) {
|
|
191
|
+
try {
|
|
192
|
+
process.kill(-shell.process.pid, "SIGKILL");
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
logger.error("Failed to force kill process:", error);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}, 1000);
|
|
199
|
+
}
|
|
200
|
+
shell.status = "killed";
|
|
201
|
+
shell.endTime = Date.now();
|
|
202
|
+
shell.runtime = shell.endTime - shell.startTime;
|
|
203
|
+
this.notifyTasksChange();
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
// Fallback to direct process kill
|
|
208
|
+
try {
|
|
209
|
+
shell.process.kill("SIGTERM");
|
|
210
|
+
setTimeout(() => {
|
|
211
|
+
if (!shell.process.killed) {
|
|
212
|
+
shell.process.kill("SIGKILL");
|
|
213
|
+
}
|
|
214
|
+
}, 1000);
|
|
215
|
+
shell.status = "killed";
|
|
216
|
+
shell.endTime = Date.now();
|
|
217
|
+
shell.runtime = shell.endTime - shell.startTime;
|
|
218
|
+
this.notifyTasksChange();
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
catch (directKillError) {
|
|
222
|
+
logger.error("Failed to kill child process:", directKillError);
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
else if (task.type === "subagent") {
|
|
228
|
+
// Subagent termination logic will be handled by aborting the AI loop
|
|
229
|
+
// which is already managed by the SubagentManager and AIManager.
|
|
230
|
+
// Here we just update the status.
|
|
231
|
+
task.status = "killed";
|
|
232
|
+
task.endTime = Date.now();
|
|
233
|
+
task.runtime = task.endTime - task.startTime;
|
|
234
|
+
this.notifyTasksChange();
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
cleanup() {
|
|
240
|
+
// Kill all running tasks
|
|
241
|
+
for (const [id, task] of this.tasks) {
|
|
242
|
+
if (task.status === "running") {
|
|
243
|
+
this.stopTask(id);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
this.tasks.clear();
|
|
247
|
+
this.notifyTasksChange();
|
|
248
|
+
}
|
|
249
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bashManager.d.ts","sourceRoot":"","sources":["../../src/managers/bashManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bashManager.d.ts","sourceRoot":"","sources":["../../src/managers/bashManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,cAAc,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAiB;IAChC,gBAAgB,UAAS;IAChC,OAAO,CAAC,cAAc,CAA6B;gBAEvC,OAAO,EAAE,kBAAkB;IAKvC,OAAO,CAAC,iBAAiB;IAIZ,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyDtD,YAAY,IAAI,IAAI;CAO5B"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { spawn } from "child_process";
|
|
2
|
-
import { addBashCommandToHistory } from "../utils/bashHistory.js";
|
|
3
2
|
export class BashManager {
|
|
4
3
|
constructor(options) {
|
|
5
4
|
this.isCommandRunning = false;
|
|
@@ -40,8 +39,6 @@ export class BashManager {
|
|
|
40
39
|
});
|
|
41
40
|
child.on("exit", (code, signal) => {
|
|
42
41
|
const exitCode = code === null && signal ? 130 : (code ?? 0);
|
|
43
|
-
// Add command to bash history
|
|
44
|
-
addBashCommandToHistory(command, this.workdir);
|
|
45
42
|
this.messageManager.completeCommandMessage(command, exitCode);
|
|
46
43
|
this.setCommandRunning(false);
|
|
47
44
|
this.currentProcess = null;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ForegroundTask, IForegroundTaskManager } from "../types/processes.js";
|
|
2
|
+
export declare class ForegroundTaskManager implements IForegroundTaskManager {
|
|
3
|
+
private activeForegroundTasks;
|
|
4
|
+
registerForegroundTask(task: ForegroundTask): void;
|
|
5
|
+
unregisterForegroundTask(id: string): void;
|
|
6
|
+
backgroundCurrentTask(): Promise<void>;
|
|
7
|
+
hasActiveTasks(): boolean;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=foregroundTaskManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foregroundTaskManager.d.ts","sourceRoot":"","sources":["../../src/managers/foregroundTaskManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/E,qBAAa,qBAAsB,YAAW,sBAAsB;IAClE,OAAO,CAAC,qBAAqB,CAAwB;IAE9C,sBAAsB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAIlD,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMpC,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5C,cAAc,IAAI,OAAO;CAGjC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export class ForegroundTaskManager {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.activeForegroundTasks = [];
|
|
4
|
+
}
|
|
5
|
+
registerForegroundTask(task) {
|
|
6
|
+
this.activeForegroundTasks.push(task);
|
|
7
|
+
}
|
|
8
|
+
unregisterForegroundTask(id) {
|
|
9
|
+
this.activeForegroundTasks = this.activeForegroundTasks.filter((t) => t.id !== id);
|
|
10
|
+
}
|
|
11
|
+
async backgroundCurrentTask() {
|
|
12
|
+
const task = this.activeForegroundTasks.pop();
|
|
13
|
+
if (task) {
|
|
14
|
+
await task.backgroundHandler();
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
hasActiveTasks() {
|
|
18
|
+
return this.activeForegroundTasks.length > 0;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"liveConfigManager.d.ts","sourceRoot":"","sources":["../../src/managers/liveConfigManager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"liveConfigManager.d.ts","sourceRoot":"","sources":["../../src/managers/liveConfigManager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAOhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAOhE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAG3E,OAAO,KAAK,EAEV,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAoB;IACvD,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuB;IAG5D,OAAO,CAAC,oBAAoB,CAAkC;IAC9D,OAAO,CAAC,sBAAsB,CAAkC;IAGhE,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,eAAe,CAAC,CAAW;IACnC,OAAO,CAAC,kBAAkB,CAAC,CAAW;IACtC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,gBAAgB,CAAkB;gBAE9B,OAAO,EAAE,wBAAwB;IAW7C;;;;OAIG;YACW,kBAAkB;IA6DhC;;OAEG;IACH,uBAAuB,IAAI,iBAAiB,GAAG,IAAI;IAInD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBjC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB/B;;;OAGG;YACW,mBAAmB;IAmNjC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAK1C;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;OAEG;IACH,gBAAgB;;;;;;;;;;;;IAgBhB,OAAO,CAAC,sBAAsB;YAMhB,gBAAgB;IA8C9B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA4F7B,OAAO,CAAC,aAAa;IAuDrB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;CAQ9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lspManager.d.ts","sourceRoot":"","sources":["../../src/managers/lspManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAS,MAAM,eAAe,CAAC;AACpD,OAAO,EACL,MAAM,EAEN,eAAe,EACf,WAAW,EAEZ,MAAM,mBAAmB,CAAC;AAI3B,UAAU,UAAU;IAClB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,GAAG,CAClB,MAAM,EACN;QAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;QAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,CAC1E,CAAC;IACF,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B;AAED,qBAAa,UAAW,YAAW,WAAW;IAC5C,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,MAAM,CAAiB;gBAEnB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;IAIvC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;YAKjD,UAAU;IAclB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;YA0BvD,WAAW;IAoGzB,OAAO,CAAC,aAAa;YAiBP,WAAW;YA0CX,gBAAgB;IAgBxB,OAAO,CAAC,IAAI,EAAE;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAoJ5C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"lspManager.d.ts","sourceRoot":"","sources":["../../src/managers/lspManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAS,MAAM,eAAe,CAAC;AACpD,OAAO,EACL,MAAM,EAEN,eAAe,EACf,WAAW,EAEZ,MAAM,mBAAmB,CAAC;AAI3B,UAAU,UAAU;IAClB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,GAAG,CAClB,MAAM,EACN;QAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;QAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,CAC1E,CAAC;IACF,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B;AAED,qBAAa,UAAW,YAAW,WAAW;IAC5C,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,MAAM,CAAiB;gBAEnB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;IAIvC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;YAKjD,UAAU;IAclB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;YA0BvD,WAAW;IAoGzB,OAAO,CAAC,aAAa;YAiBP,WAAW;YA0CX,gBAAgB;IAgBxB,OAAO,CAAC,IAAI,EAAE;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAoJ5C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAuB/B"}
|
|
@@ -310,7 +310,9 @@ export class LspManager {
|
|
|
310
310
|
await this.sendRequest(lspProc, "shutdown", {}, timeout);
|
|
311
311
|
await this.sendNotification(lspProc, "exit", {});
|
|
312
312
|
// Give it a moment to exit
|
|
313
|
-
|
|
313
|
+
if (timeout > 100) {
|
|
314
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
315
|
+
}
|
|
314
316
|
}
|
|
315
317
|
catch (error) {
|
|
316
318
|
this.logger?.debug(`Failed to gracefully shutdown LSP for ${language}: ${error}`);
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { UserMessageParams, type AgentToolBlockUpdateParams } from "../utils/messageOperations.js";
|
|
2
2
|
import type { SubagentConfiguration } from "../utils/subagentParser.js";
|
|
3
|
-
import type { Logger, Message, Usage } from "../types/index.js";
|
|
3
|
+
import type { Logger, Message, Usage, SlashCommand } from "../types/index.js";
|
|
4
4
|
import { SessionData } from "../services/session.js";
|
|
5
5
|
import { ChatCompletionMessageFunctionToolCall } from "openai/resources.js";
|
|
6
|
+
import type { MemoryRuleManager } from "./MemoryRuleManager.js";
|
|
6
7
|
export interface MessageManagerCallbacks {
|
|
7
8
|
onMessagesChange?: (messages: Message[]) => void;
|
|
8
9
|
onSessionIdChange?: (sessionId: string) => void;
|
|
@@ -21,6 +22,9 @@ export interface MessageManagerCallbacks {
|
|
|
21
22
|
onAddCommandOutputMessage?: (command: string) => void;
|
|
22
23
|
onUpdateCommandOutputMessage?: (command: string, output: string) => void;
|
|
23
24
|
onCompleteCommandMessage?: (command: string, exitCode: number) => void;
|
|
25
|
+
onSlashCommandsChange?: (commands: SlashCommand[]) => void;
|
|
26
|
+
onInfoBlockAdded?: (content: string) => void;
|
|
27
|
+
onShowRewind?: () => void;
|
|
24
28
|
onSubAgentBlockAdded?: (subagentId: string, parameters: {
|
|
25
29
|
description: string;
|
|
26
30
|
prompt: string;
|
|
@@ -34,6 +38,7 @@ export interface MessageManagerOptions {
|
|
|
34
38
|
logger?: Logger;
|
|
35
39
|
sessionType?: "main" | "subagent";
|
|
36
40
|
subagentType?: string;
|
|
41
|
+
memoryRuleManager?: MemoryRuleManager;
|
|
37
42
|
}
|
|
38
43
|
export declare class MessageManager {
|
|
39
44
|
private sessionId;
|
|
@@ -47,6 +52,7 @@ export declare class MessageManager {
|
|
|
47
52
|
private transcriptPath;
|
|
48
53
|
private savedMessageCount;
|
|
49
54
|
private filesInContext;
|
|
55
|
+
private memoryRuleManager?;
|
|
50
56
|
private sessionType;
|
|
51
57
|
private subagentType?;
|
|
52
58
|
constructor(options: MessageManagerOptions);
|
|
@@ -61,6 +67,10 @@ export declare class MessageManager {
|
|
|
61
67
|
getFilesInContext(): string[];
|
|
62
68
|
getSessionDir(): string;
|
|
63
69
|
getTranscriptPath(): string;
|
|
70
|
+
/**
|
|
71
|
+
* Get combined memory content (project memory + user memory + modular rules)
|
|
72
|
+
*/
|
|
73
|
+
getCombinedMemory(): Promise<string>;
|
|
64
74
|
/**
|
|
65
75
|
* Compute the transcript path using cached encoded workdir
|
|
66
76
|
* Called during construction and when sessionId changes
|
|
@@ -82,6 +92,14 @@ export declare class MessageManager {
|
|
|
82
92
|
* Clear messages and input history
|
|
83
93
|
*/
|
|
84
94
|
clearMessages(): void;
|
|
95
|
+
/**
|
|
96
|
+
* Trigger the rewind UI callback
|
|
97
|
+
*/
|
|
98
|
+
triggerShowRewind(): void;
|
|
99
|
+
/**
|
|
100
|
+
* Trigger slash commands change callback
|
|
101
|
+
*/
|
|
102
|
+
triggerSlashCommandsChange(commands: SlashCommand[]): void;
|
|
85
103
|
initializeFromSession(sessionData: SessionData): void;
|
|
86
104
|
addToInputHistory(input: string): void;
|
|
87
105
|
clearInputHistory(): void;
|
|
@@ -90,22 +108,24 @@ export declare class MessageManager {
|
|
|
90
108
|
mergeAssistantAdditionalFields(additionalFields: Record<string, unknown>): void;
|
|
91
109
|
updateToolBlock(params: AgentToolBlockUpdateParams): void;
|
|
92
110
|
addErrorBlock(error: string): void;
|
|
111
|
+
addInfoBlock(content: string): void;
|
|
93
112
|
/**
|
|
94
113
|
* Compress messages and update session, delete compressed messages, only keep compressed messages and subsequent messages
|
|
95
114
|
*/
|
|
96
115
|
compressMessagesAndUpdateSession(insertIndex: number, compressedContent: string, usage?: Usage): void;
|
|
97
|
-
|
|
116
|
+
addFileHistoryBlock(snapshots: import("../types/reversion.js").FileSnapshot[]): void;
|
|
98
117
|
addCommandOutputMessage(command: string): void;
|
|
99
118
|
updateCommandOutputMessage(command: string, output: string): void;
|
|
100
119
|
completeCommandMessage(command: string, exitCode: number): void;
|
|
101
|
-
addSubagentBlock(subagentId: string, subagentName: string, sessionId: string, configuration: SubagentConfiguration, status: "active" | "completed" | "error" | undefined, parameters: {
|
|
120
|
+
addSubagentBlock(subagentId: string, subagentName: string, sessionId: string, configuration: SubagentConfiguration, status: "active" | "completed" | "error" | "aborted" | undefined, parameters: {
|
|
102
121
|
description: string;
|
|
103
122
|
prompt: string;
|
|
104
123
|
subagent_type: string;
|
|
105
|
-
}): void;
|
|
124
|
+
}, runInBackground?: boolean): void;
|
|
106
125
|
updateSubagentBlock(subagentId: string, updates: Partial<{
|
|
107
126
|
status: "active" | "completed" | "error" | "aborted";
|
|
108
127
|
sessionId: string;
|
|
128
|
+
runInBackground: boolean;
|
|
109
129
|
}>): void;
|
|
110
130
|
/**
|
|
111
131
|
* Trigger usage change callback with all usage data from assistant messages
|
|
@@ -127,6 +147,16 @@ export declare class MessageManager {
|
|
|
127
147
|
* Used for hook error handling when the user prompt needs to be erased
|
|
128
148
|
*/
|
|
129
149
|
removeLastUserMessage(): void;
|
|
150
|
+
/**
|
|
151
|
+
* Truncate history to a specific index and revert file changes.
|
|
152
|
+
* @param index - The index of the user message to truncate to.
|
|
153
|
+
* @param reversionManager - Optional ReversionManager to handle file rollbacks.
|
|
154
|
+
*/
|
|
155
|
+
truncateHistory(index: number, reversionManager?: import("./reversionManager.js").ReversionManager): Promise<void>;
|
|
156
|
+
/**
|
|
157
|
+
* Rewrite the session file with the current messages.
|
|
158
|
+
*/
|
|
159
|
+
private rewriteSessionFile;
|
|
130
160
|
/**
|
|
131
161
|
* Updates the set of files mentioned in the conversation.
|
|
132
162
|
*/
|
|
@@ -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":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { addAssistantMessageToMessages, updateToolBlockInMessage, addErrorBlockToMessage, addUserMessageToMessages, extractUserInputHistory,
|
|
1
|
+
import { addAssistantMessageToMessages, updateToolBlockInMessage, addErrorBlockToMessage, addUserMessageToMessages, extractUserInputHistory, addCommandOutputMessage, updateCommandOutputInMessage, completeCommandInMessage, addSubagentBlockToMessage, updateSubagentBlockInMessage, 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";
|
|
@@ -16,6 +16,7 @@ export class MessageManager {
|
|
|
16
16
|
this.savedMessageCount = 0; // Initialize saved message count tracker
|
|
17
17
|
this.sessionType = options.sessionType || "main";
|
|
18
18
|
this.subagentType = options.subagentType;
|
|
19
|
+
this.memoryRuleManager = options.memoryRuleManager;
|
|
19
20
|
// Compute and cache the transcript path
|
|
20
21
|
this.transcriptPath = this.computeTranscriptPath();
|
|
21
22
|
}
|
|
@@ -47,6 +48,25 @@ export class MessageManager {
|
|
|
47
48
|
getTranscriptPath() {
|
|
48
49
|
return this.transcriptPath;
|
|
49
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Get combined memory content (project memory + user memory + modular rules)
|
|
53
|
+
*/
|
|
54
|
+
async getCombinedMemory() {
|
|
55
|
+
const memory = await import("../services/memory.js");
|
|
56
|
+
let combined = await memory.getCombinedMemoryContent(this.workdir);
|
|
57
|
+
if (this.memoryRuleManager) {
|
|
58
|
+
const filesInContext = this.getFilesInContext();
|
|
59
|
+
const activeRules = this.memoryRuleManager.getActiveRules(filesInContext);
|
|
60
|
+
if (activeRules.length > 0) {
|
|
61
|
+
this.logger?.debug(`Active modular rules (${activeRules.length}): ${activeRules.map((r) => r.id).join(", ")}`);
|
|
62
|
+
if (combined) {
|
|
63
|
+
combined += "\n\n";
|
|
64
|
+
}
|
|
65
|
+
combined += activeRules.map((r) => r.content).join("\n\n");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return combined;
|
|
69
|
+
}
|
|
50
70
|
/**
|
|
51
71
|
* Compute the transcript path using cached encoded workdir
|
|
52
72
|
* Called during construction and when sessionId changes
|
|
@@ -130,6 +150,18 @@ export class MessageManager {
|
|
|
130
150
|
this.setlatestTotalTokens(0);
|
|
131
151
|
this.savedMessageCount = 0; // Reset saved message count
|
|
132
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* Trigger the rewind UI callback
|
|
155
|
+
*/
|
|
156
|
+
triggerShowRewind() {
|
|
157
|
+
this.callbacks.onShowRewind?.();
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Trigger slash commands change callback
|
|
161
|
+
*/
|
|
162
|
+
triggerSlashCommandsChange(commands) {
|
|
163
|
+
this.callbacks.onSlashCommandsChange?.(commands);
|
|
164
|
+
}
|
|
133
165
|
// Initialize state from session data
|
|
134
166
|
initializeFromSession(sessionData) {
|
|
135
167
|
this.setSessionId(sessionData.id);
|
|
@@ -228,6 +260,17 @@ export class MessageManager {
|
|
|
228
260
|
this.setMessages(newMessages);
|
|
229
261
|
this.callbacks.onErrorBlockAdded?.(error);
|
|
230
262
|
}
|
|
263
|
+
addInfoBlock(content) {
|
|
264
|
+
const lastMessage = this.messages[this.messages.length - 1];
|
|
265
|
+
if (lastMessage && lastMessage.role === "assistant") {
|
|
266
|
+
lastMessage.blocks.push({
|
|
267
|
+
type: "info",
|
|
268
|
+
content,
|
|
269
|
+
});
|
|
270
|
+
this.setMessages([...this.messages]);
|
|
271
|
+
this.callbacks.onInfoBlockAdded?.(content);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
231
274
|
/**
|
|
232
275
|
* Compress messages and update session, delete compressed messages, only keep compressed messages and subsequent messages
|
|
233
276
|
*/
|
|
@@ -259,16 +302,17 @@ export class MessageManager {
|
|
|
259
302
|
// Trigger compression callback, insertIndex remains unchanged
|
|
260
303
|
this.callbacks.onCompressBlockAdded?.(insertIndex, compressedContent);
|
|
261
304
|
}
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
305
|
+
addFileHistoryBlock(snapshots) {
|
|
306
|
+
if (snapshots.length === 0)
|
|
307
|
+
return;
|
|
308
|
+
const lastMessage = this.messages[this.messages.length - 1];
|
|
309
|
+
if (lastMessage && lastMessage.role === "assistant") {
|
|
310
|
+
lastMessage.blocks.push({
|
|
311
|
+
type: "file_history",
|
|
312
|
+
snapshots,
|
|
313
|
+
});
|
|
314
|
+
this.setMessages([...this.messages]);
|
|
315
|
+
}
|
|
272
316
|
}
|
|
273
317
|
// Bash command related message operations
|
|
274
318
|
addCommandOutputMessage(command) {
|
|
@@ -298,7 +342,7 @@ export class MessageManager {
|
|
|
298
342
|
this.callbacks.onCompleteCommandMessage?.(command, exitCode);
|
|
299
343
|
}
|
|
300
344
|
// Subagent block methods
|
|
301
|
-
addSubagentBlock(subagentId, subagentName, sessionId, configuration, status = "active", parameters) {
|
|
345
|
+
addSubagentBlock(subagentId, subagentName, sessionId, configuration, status = "active", parameters, runInBackground) {
|
|
302
346
|
const params = {
|
|
303
347
|
messages: this.messages,
|
|
304
348
|
subagentId,
|
|
@@ -306,6 +350,7 @@ export class MessageManager {
|
|
|
306
350
|
sessionId,
|
|
307
351
|
status,
|
|
308
352
|
configuration,
|
|
353
|
+
runInBackground,
|
|
309
354
|
};
|
|
310
355
|
const updatedMessages = addSubagentBlockToMessage(params);
|
|
311
356
|
this.setMessages(updatedMessages);
|
|
@@ -319,7 +364,9 @@ export class MessageManager {
|
|
|
319
364
|
subagentId,
|
|
320
365
|
status: updates.status || "active",
|
|
321
366
|
};
|
|
322
|
-
|
|
367
|
+
if (updates.status) {
|
|
368
|
+
this.callbacks.onSubAgentBlockUpdated?.(params.subagentId, params.status);
|
|
369
|
+
}
|
|
323
370
|
}
|
|
324
371
|
/**
|
|
325
372
|
* Trigger usage change callback with all usage data from assistant messages
|
|
@@ -413,6 +460,50 @@ export class MessageManager {
|
|
|
413
460
|
const newMessages = removeLastUserMessage(this.messages);
|
|
414
461
|
this.setMessages(newMessages);
|
|
415
462
|
}
|
|
463
|
+
/**
|
|
464
|
+
* Truncate history to a specific index and revert file changes.
|
|
465
|
+
* @param index - The index of the user message to truncate to.
|
|
466
|
+
* @param reversionManager - Optional ReversionManager to handle file rollbacks.
|
|
467
|
+
*/
|
|
468
|
+
async truncateHistory(index, reversionManager) {
|
|
469
|
+
if (index < 0 || index >= this.messages.length) {
|
|
470
|
+
throw new Error(`Invalid message index: ${index}`);
|
|
471
|
+
}
|
|
472
|
+
// Identify messages to be removed
|
|
473
|
+
const messagesToRemove = this.messages.slice(index);
|
|
474
|
+
const messageIdsToRemove = messagesToRemove
|
|
475
|
+
.map((m) => m.id)
|
|
476
|
+
.filter((id) => !!id);
|
|
477
|
+
// Revert file changes if manager is provided
|
|
478
|
+
if (reversionManager && messageIdsToRemove.length > 0) {
|
|
479
|
+
await reversionManager.revertTo(messageIdsToRemove, this.messages);
|
|
480
|
+
}
|
|
481
|
+
// Truncate messages in memory
|
|
482
|
+
const newMessages = this.messages.slice(0, index);
|
|
483
|
+
this.setMessages(newMessages);
|
|
484
|
+
// Update persistence: rewrite the session file
|
|
485
|
+
await this.rewriteSessionFile(newMessages);
|
|
486
|
+
// Update saved message count
|
|
487
|
+
this.savedMessageCount = newMessages.length;
|
|
488
|
+
}
|
|
489
|
+
/**
|
|
490
|
+
* Rewrite the session file with the current messages.
|
|
491
|
+
*/
|
|
492
|
+
async rewriteSessionFile(messages) {
|
|
493
|
+
try {
|
|
494
|
+
const { writeFile } = await import("fs/promises");
|
|
495
|
+
const sessionMessages = messages.map((message) => ({
|
|
496
|
+
...message,
|
|
497
|
+
timestamp: new Date().toISOString(),
|
|
498
|
+
}));
|
|
499
|
+
const content = sessionMessages.map((m) => JSON.stringify(m)).join("\n") +
|
|
500
|
+
(sessionMessages.length > 0 ? "\n" : "");
|
|
501
|
+
await writeFile(this.transcriptPath, content, "utf8");
|
|
502
|
+
}
|
|
503
|
+
catch (error) {
|
|
504
|
+
this.logger?.error("Failed to rewrite session file:", error);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
416
507
|
/**
|
|
417
508
|
* Updates the set of files mentioned in the conversation.
|
|
418
509
|
*/
|