wave-agent-sdk 0.0.7 → 0.0.8

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 (172) hide show
  1. package/dist/agent.d.ts +32 -20
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +202 -20
  4. package/dist/constants/events.d.ts +28 -0
  5. package/dist/constants/events.d.ts.map +1 -0
  6. package/dist/constants/events.js +27 -0
  7. package/dist/index.d.ts +2 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +2 -0
  10. package/dist/managers/aiManager.d.ts +34 -1
  11. package/dist/managers/aiManager.d.ts.map +1 -1
  12. package/dist/managers/aiManager.js +243 -128
  13. package/dist/managers/backgroundBashManager.d.ts.map +1 -1
  14. package/dist/managers/backgroundBashManager.js +7 -6
  15. package/dist/managers/hookManager.d.ts +9 -4
  16. package/dist/managers/hookManager.d.ts.map +1 -1
  17. package/dist/managers/hookManager.js +62 -30
  18. package/dist/managers/liveConfigManager.d.ts +58 -0
  19. package/dist/managers/liveConfigManager.d.ts.map +1 -0
  20. package/dist/managers/liveConfigManager.js +160 -0
  21. package/dist/managers/messageManager.d.ts +38 -13
  22. package/dist/managers/messageManager.d.ts.map +1 -1
  23. package/dist/managers/messageManager.js +163 -30
  24. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  25. package/dist/managers/slashCommandManager.js +4 -1
  26. package/dist/managers/subagentManager.d.ts +51 -0
  27. package/dist/managers/subagentManager.d.ts.map +1 -1
  28. package/dist/managers/subagentManager.js +189 -18
  29. package/dist/services/aiService.d.ts +13 -5
  30. package/dist/services/aiService.d.ts.map +1 -1
  31. package/dist/services/aiService.js +350 -74
  32. package/dist/services/configurationWatcher.d.ts +120 -0
  33. package/dist/services/configurationWatcher.d.ts.map +1 -0
  34. package/dist/services/configurationWatcher.js +439 -0
  35. package/dist/services/fileWatcher.d.ts +69 -0
  36. package/dist/services/fileWatcher.d.ts.map +1 -0
  37. package/dist/services/fileWatcher.js +213 -0
  38. package/dist/services/hook.d.ts +91 -9
  39. package/dist/services/hook.d.ts.map +1 -1
  40. package/dist/services/hook.js +393 -43
  41. package/dist/services/jsonlHandler.d.ts +62 -0
  42. package/dist/services/jsonlHandler.d.ts.map +1 -0
  43. package/dist/services/jsonlHandler.js +257 -0
  44. package/dist/services/memory.d.ts +9 -0
  45. package/dist/services/memory.d.ts.map +1 -1
  46. package/dist/services/memory.js +81 -12
  47. package/dist/services/memoryStore.d.ts +81 -0
  48. package/dist/services/memoryStore.d.ts.map +1 -0
  49. package/dist/services/memoryStore.js +200 -0
  50. package/dist/services/session.d.ts +64 -49
  51. package/dist/services/session.d.ts.map +1 -1
  52. package/dist/services/session.js +310 -132
  53. package/dist/tools/bashTool.d.ts.map +1 -1
  54. package/dist/tools/bashTool.js +5 -4
  55. package/dist/tools/deleteFileTool.d.ts.map +1 -1
  56. package/dist/tools/deleteFileTool.js +2 -1
  57. package/dist/tools/editTool.d.ts.map +1 -1
  58. package/dist/tools/editTool.js +3 -2
  59. package/dist/tools/multiEditTool.d.ts.map +1 -1
  60. package/dist/tools/multiEditTool.js +4 -3
  61. package/dist/tools/readTool.d.ts.map +1 -1
  62. package/dist/tools/readTool.js +2 -1
  63. package/dist/tools/writeTool.d.ts.map +1 -1
  64. package/dist/tools/writeTool.js +5 -6
  65. package/dist/types/commands.d.ts +4 -0
  66. package/dist/types/commands.d.ts.map +1 -1
  67. package/dist/types/core.d.ts +35 -0
  68. package/dist/types/core.d.ts.map +1 -1
  69. package/dist/types/environment.d.ts +42 -0
  70. package/dist/types/environment.d.ts.map +1 -0
  71. package/dist/types/environment.js +21 -0
  72. package/dist/types/hooks.d.ts +8 -2
  73. package/dist/types/hooks.d.ts.map +1 -1
  74. package/dist/types/hooks.js +8 -2
  75. package/dist/types/index.d.ts +2 -0
  76. package/dist/types/index.d.ts.map +1 -1
  77. package/dist/types/index.js +2 -0
  78. package/dist/types/memoryStore.d.ts +82 -0
  79. package/dist/types/memoryStore.d.ts.map +1 -0
  80. package/dist/types/memoryStore.js +7 -0
  81. package/dist/types/messaging.d.ts +14 -2
  82. package/dist/types/messaging.d.ts.map +1 -1
  83. package/dist/types/session.d.ts +20 -0
  84. package/dist/types/session.d.ts.map +1 -0
  85. package/dist/types/session.js +7 -0
  86. package/dist/utils/bashHistory.d.ts.map +1 -1
  87. package/dist/utils/bashHistory.js +27 -26
  88. package/dist/utils/cacheControlUtils.d.ts +121 -0
  89. package/dist/utils/cacheControlUtils.d.ts.map +1 -0
  90. package/dist/utils/cacheControlUtils.js +367 -0
  91. package/dist/utils/commandPathResolver.d.ts +52 -0
  92. package/dist/utils/commandPathResolver.d.ts.map +1 -0
  93. package/dist/utils/commandPathResolver.js +145 -0
  94. package/dist/utils/configPaths.d.ts +85 -0
  95. package/dist/utils/configPaths.d.ts.map +1 -0
  96. package/dist/utils/configPaths.js +121 -0
  97. package/dist/utils/configResolver.d.ts +37 -10
  98. package/dist/utils/configResolver.d.ts.map +1 -1
  99. package/dist/utils/configResolver.js +127 -23
  100. package/dist/utils/constants.d.ts +1 -1
  101. package/dist/utils/constants.js +1 -1
  102. package/dist/utils/convertMessagesForAPI.d.ts.map +1 -1
  103. package/dist/utils/convertMessagesForAPI.js +7 -5
  104. package/dist/utils/customCommands.d.ts.map +1 -1
  105. package/dist/utils/customCommands.js +66 -21
  106. package/dist/utils/fileUtils.d.ts +15 -0
  107. package/dist/utils/fileUtils.d.ts.map +1 -0
  108. package/dist/utils/fileUtils.js +61 -0
  109. package/dist/utils/globalLogger.d.ts +102 -0
  110. package/dist/utils/globalLogger.d.ts.map +1 -0
  111. package/dist/utils/globalLogger.js +136 -0
  112. package/dist/utils/mcpUtils.d.ts.map +1 -1
  113. package/dist/utils/mcpUtils.js +25 -3
  114. package/dist/utils/messageOperations.d.ts +20 -8
  115. package/dist/utils/messageOperations.d.ts.map +1 -1
  116. package/dist/utils/messageOperations.js +25 -16
  117. package/dist/utils/pathEncoder.d.ts +104 -0
  118. package/dist/utils/pathEncoder.d.ts.map +1 -0
  119. package/dist/utils/pathEncoder.js +272 -0
  120. package/dist/utils/subagentParser.d.ts.map +1 -1
  121. package/dist/utils/subagentParser.js +2 -1
  122. package/dist/utils/tokenCalculation.d.ts +26 -0
  123. package/dist/utils/tokenCalculation.d.ts.map +1 -0
  124. package/dist/utils/tokenCalculation.js +36 -0
  125. package/package.json +6 -3
  126. package/src/agent.ts +298 -34
  127. package/src/constants/events.ts +38 -0
  128. package/src/index.ts +2 -0
  129. package/src/managers/aiManager.ts +323 -170
  130. package/src/managers/backgroundBashManager.ts +7 -6
  131. package/src/managers/hookManager.ts +83 -40
  132. package/src/managers/liveConfigManager.ts +248 -0
  133. package/src/managers/messageManager.ts +230 -63
  134. package/src/managers/slashCommandManager.ts +4 -1
  135. package/src/managers/subagentManager.ts +283 -21
  136. package/src/services/aiService.ts +474 -83
  137. package/src/services/configurationWatcher.ts +622 -0
  138. package/src/services/fileWatcher.ts +301 -0
  139. package/src/services/hook.ts +538 -47
  140. package/src/services/jsonlHandler.ts +319 -0
  141. package/src/services/memory.ts +92 -12
  142. package/src/services/memoryStore.ts +279 -0
  143. package/src/services/session.ts +381 -157
  144. package/src/tools/bashTool.ts +5 -4
  145. package/src/tools/deleteFileTool.ts +2 -1
  146. package/src/tools/editTool.ts +3 -2
  147. package/src/tools/multiEditTool.ts +4 -3
  148. package/src/tools/readTool.ts +2 -1
  149. package/src/tools/writeTool.ts +7 -6
  150. package/src/types/commands.ts +6 -0
  151. package/src/types/core.ts +44 -0
  152. package/src/types/environment.ts +60 -0
  153. package/src/types/hooks.ts +21 -8
  154. package/src/types/index.ts +2 -0
  155. package/src/types/memoryStore.ts +94 -0
  156. package/src/types/messaging.ts +14 -2
  157. package/src/types/session.ts +25 -0
  158. package/src/utils/bashHistory.ts +27 -27
  159. package/src/utils/cacheControlUtils.ts +540 -0
  160. package/src/utils/commandPathResolver.ts +189 -0
  161. package/src/utils/configPaths.ts +163 -0
  162. package/src/utils/configResolver.ts +182 -22
  163. package/src/utils/constants.ts +1 -1
  164. package/src/utils/convertMessagesForAPI.ts +7 -5
  165. package/src/utils/customCommands.ts +90 -22
  166. package/src/utils/fileUtils.ts +65 -0
  167. package/src/utils/globalLogger.ts +145 -0
  168. package/src/utils/mcpUtils.ts +34 -3
  169. package/src/utils/messageOperations.ts +42 -20
  170. package/src/utils/pathEncoder.ts +379 -0
  171. package/src/utils/subagentParser.ts +2 -1
  172. package/src/utils/tokenCalculation.ts +43 -0
@@ -0,0 +1,279 @@
1
+ /**
2
+ * Memory Store Service
3
+ *
4
+ * Provides in-memory storage for file content with automatic updates.
5
+ * Optimizes performance by keeping frequently accessed files in memory.
6
+ */
7
+
8
+ import { promises as fs } from "fs";
9
+ import { EventEmitter } from "events";
10
+ import type { Logger } from "../types/index.js";
11
+
12
+ export interface MemoryStoreEntry {
13
+ content: string;
14
+ path: string;
15
+ lastModified: number;
16
+ isLoaded: boolean;
17
+ }
18
+
19
+ export interface MemoryStoreStats {
20
+ contentSize: number;
21
+ lastUpdated: number;
22
+ updateCount: number;
23
+ isLoaded: boolean;
24
+ }
25
+
26
+ export interface MemoryUpdateEvent {
27
+ path: string;
28
+ reason: "file_change" | "initial_load" | "manual_reload";
29
+ timestamp: number;
30
+ previousSize?: number;
31
+ newSize: number;
32
+ }
33
+
34
+ export class MemoryStoreService extends EventEmitter {
35
+ private store: Map<string, MemoryStoreEntry> = new Map();
36
+ private updateCounts: Map<string, number> = new Map();
37
+ private logger?: Logger;
38
+
39
+ constructor(logger?: Logger) {
40
+ super();
41
+ this.logger = logger;
42
+ }
43
+
44
+ /**
45
+ * Get content from memory store (loads from file if not loaded)
46
+ * Maps to FR-006: Keep AGENTS.md content in memory to avoid repeated reads
47
+ */
48
+ async getContent(path: string): Promise<string> {
49
+ const entry = this.store.get(path);
50
+
51
+ if (entry && entry.isLoaded) {
52
+ this.logger?.debug(`Live Config: Memory hit for ${path}`);
53
+ return entry.content;
54
+ }
55
+
56
+ // Load from file if not in memory
57
+ return await this.loadFromFile(path, "initial_load");
58
+ }
59
+
60
+ /**
61
+ * Update memory content from file
62
+ * Maps to FR-007: Update memory content when file changes
63
+ */
64
+ async updateContent(path: string): Promise<void> {
65
+ const previousEntry = this.store.get(path);
66
+ const previousSize = previousEntry?.content.length || 0;
67
+
68
+ await this.loadFromFile(path, "file_change", previousSize);
69
+ }
70
+
71
+ /**
72
+ * Get memory store statistics
73
+ * For monitoring and debugging
74
+ */
75
+ getStats(path?: string): MemoryStoreStats {
76
+ if (path) {
77
+ const entry = this.store.get(path);
78
+ const updateCount = this.updateCounts.get(path) || 0;
79
+
80
+ return {
81
+ contentSize: entry?.content.length || 0,
82
+ lastUpdated: entry?.lastModified || 0,
83
+ updateCount,
84
+ isLoaded: entry?.isLoaded || false,
85
+ };
86
+ }
87
+
88
+ // Return aggregate stats for all entries
89
+ let totalSize = 0;
90
+ let latestUpdate = 0;
91
+ let totalUpdates = 0;
92
+ let anyLoaded = false;
93
+
94
+ for (const [entryPath, entry] of this.store) {
95
+ totalSize += entry.content.length;
96
+ latestUpdate = Math.max(latestUpdate, entry.lastModified);
97
+ totalUpdates += this.updateCounts.get(entryPath) || 0;
98
+ anyLoaded = anyLoaded || entry.isLoaded;
99
+ }
100
+
101
+ return {
102
+ contentSize: totalSize,
103
+ lastUpdated: latestUpdate,
104
+ updateCount: totalUpdates,
105
+ isLoaded: anyLoaded,
106
+ };
107
+ }
108
+
109
+ /**
110
+ * Check if content is loaded in memory
111
+ * For status checking
112
+ */
113
+ isLoaded(path: string): boolean {
114
+ const entry = this.store.get(path);
115
+ return entry?.isLoaded || false;
116
+ }
117
+
118
+ /**
119
+ * Manually reload content from file
120
+ * For force refresh scenarios
121
+ */
122
+ async reloadContent(path: string): Promise<void> {
123
+ const previousEntry = this.store.get(path);
124
+ const previousSize = previousEntry?.content.length || 0;
125
+
126
+ await this.loadFromFile(path, "manual_reload", previousSize);
127
+ }
128
+
129
+ /**
130
+ * Remove content from memory store
131
+ * For cleanup when file is deleted
132
+ */
133
+ removeContent(path: string): boolean {
134
+ const removed = this.store.delete(path);
135
+ this.updateCounts.delete(path);
136
+
137
+ if (removed) {
138
+ this.logger?.info(`Live Config: Removed ${path} from memory store`);
139
+ }
140
+
141
+ return removed;
142
+ }
143
+
144
+ /**
145
+ * Clear all content from memory store
146
+ * For cleanup and testing
147
+ */
148
+ clear(): void {
149
+ const pathCount = this.store.size;
150
+ this.store.clear();
151
+ this.updateCounts.clear();
152
+
153
+ if (pathCount > 0) {
154
+ this.logger?.info(
155
+ `Live Config: Cleared ${pathCount} entries from memory store`,
156
+ );
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Get all stored paths
162
+ * For monitoring and debugging
163
+ */
164
+ getStoredPaths(): string[] {
165
+ return Array.from(this.store.keys());
166
+ }
167
+
168
+ /**
169
+ * Check if file exists and is accessible
170
+ */
171
+ async fileExists(path: string): Promise<boolean> {
172
+ try {
173
+ await fs.access(path);
174
+ return true;
175
+ } catch {
176
+ return false;
177
+ }
178
+ }
179
+
180
+ private async loadFromFile(
181
+ path: string,
182
+ reason: MemoryUpdateEvent["reason"],
183
+ previousSize?: number,
184
+ ): Promise<string> {
185
+ try {
186
+ // Check if file exists
187
+ const exists = await this.fileExists(path);
188
+ if (!exists) {
189
+ // Handle file deletion gracefully
190
+ const entry: MemoryStoreEntry = {
191
+ content: "",
192
+ path,
193
+ lastModified: Date.now(),
194
+ isLoaded: true,
195
+ };
196
+
197
+ this.store.set(path, entry);
198
+ this.incrementUpdateCount(path);
199
+
200
+ this.logger?.info(
201
+ `Live Config: File ${path} not found, storing empty content`,
202
+ );
203
+
204
+ this.emitUpdateEvent(path, reason, previousSize, 0);
205
+ return "";
206
+ }
207
+
208
+ // Read file content
209
+ const content = await fs.readFile(path, "utf-8");
210
+ const stats = await fs.stat(path);
211
+
212
+ const entry: MemoryStoreEntry = {
213
+ content,
214
+ path,
215
+ lastModified: stats.mtime.getTime(),
216
+ isLoaded: true,
217
+ };
218
+
219
+ this.store.set(path, entry);
220
+ this.incrementUpdateCount(path);
221
+
222
+ this.logger?.info(
223
+ `Live Config: Loaded ${content.length} bytes from ${path} into memory`,
224
+ );
225
+
226
+ this.emitUpdateEvent(path, reason, previousSize, content.length);
227
+ return content;
228
+ } catch (error) {
229
+ const errorMessage = `Live Config: Failed to load ${path} into memory: ${(error as Error).message}`;
230
+ this.logger?.error(errorMessage);
231
+
232
+ // Return existing content if available, otherwise empty string
233
+ const existingEntry = this.store.get(path);
234
+ if (existingEntry?.isLoaded) {
235
+ this.logger?.warn(
236
+ `Live Config: Using cached content for ${path} due to read error`,
237
+ );
238
+ return existingEntry.content;
239
+ }
240
+
241
+ // Store empty content as fallback
242
+ const entry: MemoryStoreEntry = {
243
+ content: "",
244
+ path,
245
+ lastModified: Date.now(),
246
+ isLoaded: true,
247
+ };
248
+
249
+ this.store.set(path, entry);
250
+ this.emitUpdateEvent(path, reason, previousSize, 0);
251
+ return "";
252
+ }
253
+ }
254
+
255
+ private incrementUpdateCount(path: string): void {
256
+ const current = this.updateCounts.get(path) || 0;
257
+ this.updateCounts.set(path, current + 1);
258
+ }
259
+
260
+ private emitUpdateEvent(
261
+ path: string,
262
+ reason: MemoryUpdateEvent["reason"],
263
+ previousSize: number | undefined,
264
+ newSize: number,
265
+ ): void {
266
+ const event: MemoryUpdateEvent = {
267
+ path,
268
+ reason,
269
+ timestamp: Date.now(),
270
+ previousSize,
271
+ newSize,
272
+ };
273
+
274
+ this.emit("memoryUpdate", event);
275
+ this.logger?.debug(
276
+ `Live Config: Memory update event for ${path}: ${reason}`,
277
+ );
278
+ }
279
+ }