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.
- package/dist/agent.d.ts +32 -20
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +202 -20
- package/dist/constants/events.d.ts +28 -0
- package/dist/constants/events.d.ts.map +1 -0
- package/dist/constants/events.js +27 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/managers/aiManager.d.ts +34 -1
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +243 -128
- package/dist/managers/backgroundBashManager.d.ts.map +1 -1
- package/dist/managers/backgroundBashManager.js +7 -6
- package/dist/managers/hookManager.d.ts +9 -4
- package/dist/managers/hookManager.d.ts.map +1 -1
- package/dist/managers/hookManager.js +62 -30
- package/dist/managers/liveConfigManager.d.ts +58 -0
- package/dist/managers/liveConfigManager.d.ts.map +1 -0
- package/dist/managers/liveConfigManager.js +160 -0
- package/dist/managers/messageManager.d.ts +38 -13
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +163 -30
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +4 -1
- package/dist/managers/subagentManager.d.ts +51 -0
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +189 -18
- package/dist/services/aiService.d.ts +13 -5
- package/dist/services/aiService.d.ts.map +1 -1
- package/dist/services/aiService.js +350 -74
- package/dist/services/configurationWatcher.d.ts +120 -0
- package/dist/services/configurationWatcher.d.ts.map +1 -0
- package/dist/services/configurationWatcher.js +439 -0
- package/dist/services/fileWatcher.d.ts +69 -0
- package/dist/services/fileWatcher.d.ts.map +1 -0
- package/dist/services/fileWatcher.js +213 -0
- package/dist/services/hook.d.ts +91 -9
- package/dist/services/hook.d.ts.map +1 -1
- package/dist/services/hook.js +393 -43
- package/dist/services/jsonlHandler.d.ts +62 -0
- package/dist/services/jsonlHandler.d.ts.map +1 -0
- package/dist/services/jsonlHandler.js +257 -0
- package/dist/services/memory.d.ts +9 -0
- package/dist/services/memory.d.ts.map +1 -1
- package/dist/services/memory.js +81 -12
- package/dist/services/memoryStore.d.ts +81 -0
- package/dist/services/memoryStore.d.ts.map +1 -0
- package/dist/services/memoryStore.js +200 -0
- package/dist/services/session.d.ts +64 -49
- package/dist/services/session.d.ts.map +1 -1
- package/dist/services/session.js +310 -132
- package/dist/tools/bashTool.d.ts.map +1 -1
- package/dist/tools/bashTool.js +5 -4
- package/dist/tools/deleteFileTool.d.ts.map +1 -1
- package/dist/tools/deleteFileTool.js +2 -1
- package/dist/tools/editTool.d.ts.map +1 -1
- package/dist/tools/editTool.js +3 -2
- package/dist/tools/multiEditTool.d.ts.map +1 -1
- package/dist/tools/multiEditTool.js +4 -3
- package/dist/tools/readTool.d.ts.map +1 -1
- package/dist/tools/readTool.js +2 -1
- package/dist/tools/writeTool.d.ts.map +1 -1
- package/dist/tools/writeTool.js +5 -6
- package/dist/types/commands.d.ts +4 -0
- package/dist/types/commands.d.ts.map +1 -1
- package/dist/types/core.d.ts +35 -0
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/environment.d.ts +42 -0
- package/dist/types/environment.d.ts.map +1 -0
- package/dist/types/environment.js +21 -0
- package/dist/types/hooks.d.ts +8 -2
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/hooks.js +8 -2
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/memoryStore.d.ts +82 -0
- package/dist/types/memoryStore.d.ts.map +1 -0
- package/dist/types/memoryStore.js +7 -0
- package/dist/types/messaging.d.ts +14 -2
- package/dist/types/messaging.d.ts.map +1 -1
- package/dist/types/session.d.ts +20 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +7 -0
- package/dist/utils/bashHistory.d.ts.map +1 -1
- package/dist/utils/bashHistory.js +27 -26
- package/dist/utils/cacheControlUtils.d.ts +121 -0
- package/dist/utils/cacheControlUtils.d.ts.map +1 -0
- package/dist/utils/cacheControlUtils.js +367 -0
- package/dist/utils/commandPathResolver.d.ts +52 -0
- package/dist/utils/commandPathResolver.d.ts.map +1 -0
- package/dist/utils/commandPathResolver.js +145 -0
- package/dist/utils/configPaths.d.ts +85 -0
- package/dist/utils/configPaths.d.ts.map +1 -0
- package/dist/utils/configPaths.js +121 -0
- package/dist/utils/configResolver.d.ts +37 -10
- package/dist/utils/configResolver.d.ts.map +1 -1
- package/dist/utils/configResolver.js +127 -23
- package/dist/utils/constants.d.ts +1 -1
- package/dist/utils/constants.js +1 -1
- package/dist/utils/convertMessagesForAPI.d.ts.map +1 -1
- package/dist/utils/convertMessagesForAPI.js +7 -5
- package/dist/utils/customCommands.d.ts.map +1 -1
- package/dist/utils/customCommands.js +66 -21
- package/dist/utils/fileUtils.d.ts +15 -0
- package/dist/utils/fileUtils.d.ts.map +1 -0
- package/dist/utils/fileUtils.js +61 -0
- package/dist/utils/globalLogger.d.ts +102 -0
- package/dist/utils/globalLogger.d.ts.map +1 -0
- package/dist/utils/globalLogger.js +136 -0
- package/dist/utils/mcpUtils.d.ts.map +1 -1
- package/dist/utils/mcpUtils.js +25 -3
- package/dist/utils/messageOperations.d.ts +20 -8
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/messageOperations.js +25 -16
- package/dist/utils/pathEncoder.d.ts +104 -0
- package/dist/utils/pathEncoder.d.ts.map +1 -0
- package/dist/utils/pathEncoder.js +272 -0
- package/dist/utils/subagentParser.d.ts.map +1 -1
- package/dist/utils/subagentParser.js +2 -1
- package/dist/utils/tokenCalculation.d.ts +26 -0
- package/dist/utils/tokenCalculation.d.ts.map +1 -0
- package/dist/utils/tokenCalculation.js +36 -0
- package/package.json +6 -3
- package/src/agent.ts +298 -34
- package/src/constants/events.ts +38 -0
- package/src/index.ts +2 -0
- package/src/managers/aiManager.ts +323 -170
- package/src/managers/backgroundBashManager.ts +7 -6
- package/src/managers/hookManager.ts +83 -40
- package/src/managers/liveConfigManager.ts +248 -0
- package/src/managers/messageManager.ts +230 -63
- package/src/managers/slashCommandManager.ts +4 -1
- package/src/managers/subagentManager.ts +283 -21
- package/src/services/aiService.ts +474 -83
- package/src/services/configurationWatcher.ts +622 -0
- package/src/services/fileWatcher.ts +301 -0
- package/src/services/hook.ts +538 -47
- package/src/services/jsonlHandler.ts +319 -0
- package/src/services/memory.ts +92 -12
- package/src/services/memoryStore.ts +279 -0
- package/src/services/session.ts +381 -157
- package/src/tools/bashTool.ts +5 -4
- package/src/tools/deleteFileTool.ts +2 -1
- package/src/tools/editTool.ts +3 -2
- package/src/tools/multiEditTool.ts +4 -3
- package/src/tools/readTool.ts +2 -1
- package/src/tools/writeTool.ts +7 -6
- package/src/types/commands.ts +6 -0
- package/src/types/core.ts +44 -0
- package/src/types/environment.ts +60 -0
- package/src/types/hooks.ts +21 -8
- package/src/types/index.ts +2 -0
- package/src/types/memoryStore.ts +94 -0
- package/src/types/messaging.ts +14 -2
- package/src/types/session.ts +25 -0
- package/src/utils/bashHistory.ts +27 -27
- package/src/utils/cacheControlUtils.ts +540 -0
- package/src/utils/commandPathResolver.ts +189 -0
- package/src/utils/configPaths.ts +163 -0
- package/src/utils/configResolver.ts +182 -22
- package/src/utils/constants.ts +1 -1
- package/src/utils/convertMessagesForAPI.ts +7 -5
- package/src/utils/customCommands.ts +90 -22
- package/src/utils/fileUtils.ts +65 -0
- package/src/utils/globalLogger.ts +145 -0
- package/src/utils/mcpUtils.ts +34 -3
- package/src/utils/messageOperations.ts +42 -20
- package/src/utils/pathEncoder.ts +379 -0
- package/src/utils/subagentParser.ts +2 -1
- 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
|
+
}
|