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.
Files changed (194) hide show
  1. package/dist/agent.d.ts +66 -20
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +156 -83
  4. package/dist/constants/prompts.d.ts +7 -2
  5. package/dist/constants/prompts.d.ts.map +1 -1
  6. package/dist/constants/prompts.js +41 -5
  7. package/dist/constants/tools.d.ts +2 -2
  8. package/dist/constants/tools.js +2 -2
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +1 -1
  12. package/dist/managers/MemoryRuleManager.d.ts.map +1 -1
  13. package/dist/managers/MemoryRuleManager.js +16 -2
  14. package/dist/managers/aiManager.d.ts +14 -4
  15. package/dist/managers/aiManager.d.ts.map +1 -1
  16. package/dist/managers/aiManager.js +61 -9
  17. package/dist/managers/backgroundBashManager.d.ts.map +1 -1
  18. package/dist/managers/backgroundBashManager.js +1 -0
  19. package/dist/managers/backgroundTaskManager.d.ts +35 -0
  20. package/dist/managers/backgroundTaskManager.d.ts.map +1 -0
  21. package/dist/managers/backgroundTaskManager.js +249 -0
  22. package/dist/managers/bashManager.d.ts.map +1 -1
  23. package/dist/managers/bashManager.js +0 -3
  24. package/dist/managers/foregroundTaskManager.d.ts +9 -0
  25. package/dist/managers/foregroundTaskManager.d.ts.map +1 -0
  26. package/dist/managers/foregroundTaskManager.js +20 -0
  27. package/dist/managers/liveConfigManager.d.ts +1 -1
  28. package/dist/managers/liveConfigManager.d.ts.map +1 -1
  29. package/dist/managers/lspManager.d.ts.map +1 -1
  30. package/dist/managers/lspManager.js +3 -1
  31. package/dist/managers/messageManager.d.ts +34 -4
  32. package/dist/managers/messageManager.d.ts.map +1 -1
  33. package/dist/managers/messageManager.js +104 -13
  34. package/dist/managers/permissionManager.d.ts.map +1 -1
  35. package/dist/managers/permissionManager.js +11 -13
  36. package/dist/managers/pluginManager.d.ts.map +1 -1
  37. package/dist/managers/pluginManager.js +3 -2
  38. package/dist/managers/pluginScopeManager.d.ts +13 -2
  39. package/dist/managers/pluginScopeManager.d.ts.map +1 -1
  40. package/dist/managers/pluginScopeManager.js +38 -0
  41. package/dist/managers/reversionManager.d.ts +39 -0
  42. package/dist/managers/reversionManager.d.ts.map +1 -0
  43. package/dist/managers/reversionManager.js +118 -0
  44. package/dist/managers/slashCommandManager.d.ts +4 -1
  45. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  46. package/dist/managers/slashCommandManager.js +16 -6
  47. package/dist/managers/subagentManager.d.ts +13 -2
  48. package/dist/managers/subagentManager.d.ts.map +1 -1
  49. package/dist/managers/subagentManager.js +144 -35
  50. package/dist/managers/toolManager.d.ts +11 -1
  51. package/dist/managers/toolManager.d.ts.map +1 -1
  52. package/dist/managers/toolManager.js +11 -3
  53. package/dist/services/GitService.d.ts.map +1 -1
  54. package/dist/services/GitService.js +6 -2
  55. package/dist/services/MarketplaceService.d.ts +14 -1
  56. package/dist/services/MarketplaceService.d.ts.map +1 -1
  57. package/dist/services/MarketplaceService.js +72 -4
  58. package/dist/services/MemoryRuleService.d.ts +1 -1
  59. package/dist/services/MemoryRuleService.d.ts.map +1 -1
  60. package/dist/services/MemoryRuleService.js +13 -2
  61. package/dist/services/aiService.js +1 -1
  62. package/dist/services/configurationService.d.ts +18 -2
  63. package/dist/services/configurationService.d.ts.map +1 -1
  64. package/dist/services/configurationService.js +62 -0
  65. package/dist/services/fileWatcher.d.ts +0 -5
  66. package/dist/services/fileWatcher.d.ts.map +1 -1
  67. package/dist/services/fileWatcher.js +0 -11
  68. package/dist/services/memory.js +1 -1
  69. package/dist/services/pluginLoader.d.ts.map +1 -1
  70. package/dist/services/pluginLoader.js +6 -1
  71. package/dist/services/reversionService.d.ts +24 -0
  72. package/dist/services/reversionService.d.ts.map +1 -0
  73. package/dist/services/reversionService.js +76 -0
  74. package/dist/services/session.d.ts +7 -0
  75. package/dist/services/session.d.ts.map +1 -1
  76. package/dist/services/session.js +126 -3
  77. package/dist/tools/bashTool.d.ts +0 -8
  78. package/dist/tools/bashTool.d.ts.map +1 -1
  79. package/dist/tools/bashTool.js +52 -174
  80. package/dist/tools/deleteFileTool.d.ts.map +1 -1
  81. package/dist/tools/deleteFileTool.js +9 -0
  82. package/dist/tools/editTool.d.ts.map +1 -1
  83. package/dist/tools/editTool.js +15 -4
  84. package/dist/tools/multiEditTool.d.ts.map +1 -1
  85. package/dist/tools/multiEditTool.js +16 -5
  86. package/dist/tools/taskOutputTool.d.ts +3 -0
  87. package/dist/tools/taskOutputTool.d.ts.map +1 -0
  88. package/dist/tools/taskOutputTool.js +149 -0
  89. package/dist/tools/taskStopTool.d.ts +3 -0
  90. package/dist/tools/taskStopTool.d.ts.map +1 -0
  91. package/dist/tools/taskStopTool.js +65 -0
  92. package/dist/tools/taskTool.d.ts.map +1 -1
  93. package/dist/tools/taskTool.js +105 -63
  94. package/dist/tools/types.d.ts +7 -0
  95. package/dist/tools/types.d.ts.map +1 -1
  96. package/dist/tools/writeTool.d.ts.map +1 -1
  97. package/dist/tools/writeTool.js +9 -0
  98. package/dist/types/commands.d.ts +1 -0
  99. package/dist/types/commands.d.ts.map +1 -1
  100. package/dist/types/configuration.d.ts +3 -0
  101. package/dist/types/configuration.d.ts.map +1 -1
  102. package/dist/types/environment.d.ts +2 -1
  103. package/dist/types/environment.d.ts.map +1 -1
  104. package/dist/types/environment.js +0 -6
  105. package/dist/types/history.d.ts +5 -0
  106. package/dist/types/history.d.ts.map +1 -0
  107. package/dist/types/history.js +1 -0
  108. package/dist/types/index.d.ts +1 -0
  109. package/dist/types/index.d.ts.map +1 -1
  110. package/dist/types/index.js +1 -0
  111. package/dist/types/marketplace.d.ts +4 -0
  112. package/dist/types/marketplace.d.ts.map +1 -1
  113. package/dist/types/messaging.d.ts +7 -1
  114. package/dist/types/messaging.d.ts.map +1 -1
  115. package/dist/types/processes.d.ts +24 -4
  116. package/dist/types/processes.d.ts.map +1 -1
  117. package/dist/types/reversion.d.ts +29 -0
  118. package/dist/types/reversion.d.ts.map +1 -0
  119. package/dist/types/reversion.js +1 -0
  120. package/dist/utils/builtinSubagents.d.ts.map +1 -1
  121. package/dist/utils/builtinSubagents.js +16 -0
  122. package/dist/utils/constants.d.ts +2 -2
  123. package/dist/utils/constants.d.ts.map +1 -1
  124. package/dist/utils/constants.js +2 -2
  125. package/dist/utils/editUtils.d.ts +4 -9
  126. package/dist/utils/editUtils.d.ts.map +1 -1
  127. package/dist/utils/editUtils.js +54 -55
  128. package/dist/utils/messageOperations.d.ts +3 -1
  129. package/dist/utils/messageOperations.d.ts.map +1 -1
  130. package/dist/utils/messageOperations.js +8 -1
  131. package/dist/utils/openaiClient.d.ts.map +1 -1
  132. package/dist/utils/openaiClient.js +56 -26
  133. package/dist/utils/promptHistory.d.ts +20 -0
  134. package/dist/utils/promptHistory.d.ts.map +1 -0
  135. package/dist/utils/promptHistory.js +117 -0
  136. package/package.json +5 -3
  137. package/src/agent.ts +193 -109
  138. package/src/constants/prompts.ts +45 -5
  139. package/src/constants/tools.ts +2 -2
  140. package/src/index.ts +1 -1
  141. package/src/managers/MemoryRuleManager.ts +18 -2
  142. package/src/managers/aiManager.ts +87 -18
  143. package/src/managers/backgroundBashManager.ts +1 -0
  144. package/src/managers/backgroundTaskManager.ts +306 -0
  145. package/src/managers/bashManager.ts +0 -4
  146. package/src/managers/foregroundTaskManager.ts +26 -0
  147. package/src/managers/liveConfigManager.ts +2 -1
  148. package/src/managers/lspManager.ts +3 -1
  149. package/src/managers/messageManager.ts +136 -18
  150. package/src/managers/permissionManager.ts +11 -13
  151. package/src/managers/pluginManager.ts +4 -3
  152. package/src/managers/pluginScopeManager.ts +57 -8
  153. package/src/managers/reversionManager.ts +152 -0
  154. package/src/managers/slashCommandManager.ts +30 -7
  155. package/src/managers/subagentManager.ts +176 -31
  156. package/src/managers/toolManager.ts +23 -4
  157. package/src/services/GitService.ts +6 -2
  158. package/src/services/MarketplaceService.ts +100 -4
  159. package/src/services/MemoryRuleService.ts +18 -6
  160. package/src/services/aiService.ts +1 -1
  161. package/src/services/configurationService.ts +79 -1
  162. package/src/services/fileWatcher.ts +0 -13
  163. package/src/services/memory.ts +1 -1
  164. package/src/services/pluginLoader.ts +7 -1
  165. package/src/services/reversionService.ts +94 -0
  166. package/src/services/session.ts +161 -3
  167. package/src/tools/bashTool.ts +73 -200
  168. package/src/tools/deleteFileTool.ts +15 -0
  169. package/src/tools/editTool.ts +20 -10
  170. package/src/tools/multiEditTool.ts +21 -11
  171. package/src/tools/taskOutputTool.ts +174 -0
  172. package/src/tools/taskStopTool.ts +72 -0
  173. package/src/tools/taskTool.ts +130 -74
  174. package/src/tools/types.ts +7 -0
  175. package/src/tools/writeTool.ts +14 -0
  176. package/src/types/commands.ts +3 -0
  177. package/src/types/configuration.ts +4 -0
  178. package/src/types/environment.ts +3 -1
  179. package/src/types/history.ts +4 -0
  180. package/src/types/index.ts +1 -0
  181. package/src/types/marketplace.ts +5 -0
  182. package/src/types/messaging.ts +9 -1
  183. package/src/types/processes.ts +33 -4
  184. package/src/types/reversion.ts +29 -0
  185. package/src/utils/builtinSubagents.ts +18 -0
  186. package/src/utils/constants.ts +2 -2
  187. package/src/utils/editUtils.ts +66 -58
  188. package/src/utils/messageOperations.ts +10 -0
  189. package/src/utils/openaiClient.ts +69 -35
  190. package/src/utils/promptHistory.ts +133 -0
  191. package/dist/utils/bashHistory.d.ts +0 -50
  192. package/dist/utils/bashHistory.d.ts.map +0 -1
  193. package/dist/utils/bashHistory.js +0 -256
  194. 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":"AAEA,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;IA4DtD,YAAY,IAAI,IAAI;CAO5B"}
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
+ }
@@ -75,7 +75,7 @@ export declare class LiveConfigManager {
75
75
  watchedFiles: {
76
76
  path: string;
77
77
  isActive: boolean;
78
- method: "native" | "polling" | "failed";
78
+ method: "failed" | "native" | "polling";
79
79
  errorCount: number;
80
80
  }[];
81
81
  };
@@ -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;AAMhD,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
+ {"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;CAqB/B"}
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
- await new Promise((resolve) => setTimeout(resolve, 100));
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
- addMemoryBlock(content: string, success: boolean, type: "project" | "user", storagePath: string): void;
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":"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"}
1
+ {"version":3,"file":"messageManager.d.ts","sourceRoot":"","sources":["../../src/managers/messageManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAYL,iBAAiB,EAGjB,KAAK,0BAA0B,EAChC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE9E,OAAO,EAIL,WAAW,EAEZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qCAAqC,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,MAAM,WAAW,uBAAuB;IACtC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACjD,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,yBAAyB,CAAC,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,wBAAwB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACvD,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IAE3C,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAEzD,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAC;IAErC,yBAAyB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAEzE,2BAA2B,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3E,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAClE,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,oBAAoB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtE,wBAAwB,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5D,kBAAkB,CAAC,EAAE,CACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,SAAS,GAAG,MAAM,EACxB,WAAW,EAAE,MAAM,KAChB,IAAI,CAAC;IAEV,yBAAyB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,4BAA4B,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzE,wBAAwB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACvE,qBAAqB,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;IAC3D,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAE7C,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAE1B,oBAAoB,CAAC,EAAE,CACrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;KACvB,KACE,IAAI,CAAC;IACV,sBAAsB,CAAC,EAAE,CACvB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,KACjD,IAAI,CAAC;CACX;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,uBAAuB,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,qBAAa,cAAc;IAEzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,gBAAgB,CAAW;IACnC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,iBAAiB,CAAC,CAAoB;IAC9C,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,YAAY,CAAC,CAAS;gBAElB,OAAO,EAAE,qBAAqB;IAmBnC,YAAY,IAAI,MAAM;IAItB,WAAW,IAAI,OAAO,EAAE;IAIxB,oBAAoB,IAAI,MAAM;IAI9B,mBAAmB,IAAI,MAAM,EAAE;IAI/B,UAAU,IAAI,MAAM;IAI3B;;OAEG;IACI,iBAAiB,IAAI,MAAM,EAAE;IAI7B,aAAa,IAAI,MAAM;IAIvB,iBAAiB,IAAI,MAAM;IAIlC;;OAEG;IACU,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAqBjD;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAStB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAY5C;;OAEG;YACW,qBAAqB;IAQ5B,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI;IAM7C;;OAEG;IACU,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IA+BlC,oBAAoB,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI;IAQrD,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI;IAK5D;;OAEG;IACI,aAAa,IAAI,IAAI;IAQ5B;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAIhC;;OAEG;IACI,0BAA0B,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI;IAK1D,qBAAqB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAerD,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAatC,iBAAiB,IAAI,IAAI;IAKzB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAW/C,mBAAmB,CACxB,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,qCAAqC,EAAE,EACnD,KAAK,CAAC,EAAE,KAAK,EACb,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACzC,IAAI;IAsBA,8BAA8B,CACnC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACxC,IAAI;IA+BA,eAAe,CAAC,MAAM,EAAE,0BAA0B,GAAG,IAAI;IAqBzD,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IASlC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAY1C;;OAEG;IACI,gCAAgC,CACrC,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,MAAM,EACzB,KAAK,CAAC,EAAE,KAAK,GACZ,IAAI;IAoCA,mBAAmB,CACxB,SAAS,EAAE,OAAO,uBAAuB,EAAE,YAAY,EAAE,GACxD,IAAI;IAcA,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAS9C,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAUjE,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAW/D,gBAAgB,CACrB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,qBAAqB,EACpC,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,YAAW,EAC/D,UAAU,EAAE;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;KACvB,EACD,eAAe,CAAC,EAAE,OAAO,GACxB,IAAI;IAeA,mBAAmB,CACxB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,CAAC;QACf,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;QACrD,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC,GACD,IAAI;IAiBP;;OAEG;IACI,kBAAkB,IAAI,IAAI;IAUjC;;;;OAIG;IACI,2BAA2B,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI;IA6CvE;;;OAGG;IACI,6BAA6B,CAAC,uBAAuB,EAAE,MAAM,GAAG,IAAI;IA8C3E;;;OAGG;IACI,qBAAqB,IAAI,IAAI;IAKpC;;;;OAIG;IACU,eAAe,CAC1B,KAAK,EAAE,MAAM,EACb,gBAAgB,CAAC,EAAE,OAAO,uBAAuB,EAAE,gBAAgB,GAClE,OAAO,CAAC,IAAI,CAAC;IA2BhB;;OAEG;YACW,kBAAkB;IAoBhC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAyB5B,OAAO,CAAC,sBAAsB;CA4B/B"}
@@ -1,4 +1,4 @@
1
- import { addAssistantMessageToMessages, updateToolBlockInMessage, addErrorBlockToMessage, addUserMessageToMessages, extractUserInputHistory, addMemoryBlockToMessage, addCommandOutputMessage, updateCommandOutputInMessage, completeCommandInMessage, addSubagentBlockToMessage, updateSubagentBlockInMessage, removeLastUserMessage, } from "../utils/messageOperations.js";
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
- addMemoryBlock(content, success, type, storagePath) {
263
- const newMessages = addMemoryBlockToMessage({
264
- messages: this.messages,
265
- content,
266
- isSuccess: success,
267
- memoryType: type,
268
- storagePath,
269
- });
270
- this.setMessages(newMessages);
271
- this.callbacks.onMemoryBlockAdded?.(content, success, type, storagePath);
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
- this.callbacks.onSubAgentBlockUpdated?.(params.subagentId, params.status);
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
  */