wave-agent-sdk 0.0.8 → 0.0.10
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 +92 -23
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +340 -137
- 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 +14 -36
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +74 -77
- package/dist/managers/backgroundBashManager.d.ts.map +1 -1
- package/dist/managers/backgroundBashManager.js +4 -3
- package/dist/managers/hookManager.d.ts +3 -8
- package/dist/managers/hookManager.d.ts.map +1 -1
- package/dist/managers/hookManager.js +39 -29
- package/dist/managers/liveConfigManager.d.ts +55 -18
- package/dist/managers/liveConfigManager.d.ts.map +1 -1
- package/dist/managers/liveConfigManager.js +372 -90
- package/dist/managers/lspManager.d.ts +43 -0
- package/dist/managers/lspManager.d.ts.map +1 -0
- package/dist/managers/lspManager.js +326 -0
- package/dist/managers/messageManager.d.ts +8 -16
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +52 -74
- package/dist/managers/permissionManager.d.ts +66 -0
- package/dist/managers/permissionManager.d.ts.map +1 -0
- package/dist/managers/permissionManager.js +208 -0
- package/dist/managers/skillManager.d.ts +1 -0
- package/dist/managers/skillManager.d.ts.map +1 -1
- package/dist/managers/skillManager.js +2 -1
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +0 -1
- package/dist/managers/subagentManager.d.ts +8 -23
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +97 -117
- package/dist/managers/toolManager.d.ts +38 -1
- package/dist/managers/toolManager.d.ts.map +1 -1
- package/dist/managers/toolManager.js +66 -2
- package/dist/services/aiService.d.ts +3 -1
- package/dist/services/aiService.d.ts.map +1 -1
- package/dist/services/aiService.js +123 -30
- package/dist/services/configurationService.d.ts +116 -0
- package/dist/services/configurationService.d.ts.map +1 -0
- package/dist/services/configurationService.js +585 -0
- package/dist/services/fileWatcher.d.ts.map +1 -1
- package/dist/services/fileWatcher.js +5 -6
- package/dist/services/hook.d.ts +7 -124
- package/dist/services/hook.d.ts.map +1 -1
- package/dist/services/hook.js +46 -458
- package/dist/services/jsonlHandler.d.ts +24 -15
- package/dist/services/jsonlHandler.d.ts.map +1 -1
- package/dist/services/jsonlHandler.js +67 -88
- package/dist/services/memory.d.ts +0 -9
- package/dist/services/memory.d.ts.map +1 -1
- package/dist/services/memory.js +2 -49
- package/dist/services/session.d.ts +82 -33
- package/dist/services/session.d.ts.map +1 -1
- package/dist/services/session.js +275 -181
- package/dist/tools/bashTool.d.ts.map +1 -1
- package/dist/tools/bashTool.js +72 -13
- package/dist/tools/deleteFileTool.d.ts.map +1 -1
- package/dist/tools/deleteFileTool.js +25 -0
- package/dist/tools/editTool.d.ts.map +1 -1
- package/dist/tools/editTool.js +30 -6
- package/dist/tools/lspTool.d.ts +6 -0
- package/dist/tools/lspTool.d.ts.map +1 -0
- package/dist/tools/lspTool.js +589 -0
- package/dist/tools/multiEditTool.d.ts.map +1 -1
- package/dist/tools/multiEditTool.js +26 -7
- package/dist/tools/readTool.d.ts.map +1 -1
- package/dist/tools/readTool.js +111 -2
- package/dist/tools/skillTool.js +2 -2
- package/dist/tools/todoWriteTool.d.ts.map +1 -1
- package/dist/tools/todoWriteTool.js +23 -0
- package/dist/tools/types.d.ts +11 -8
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/writeTool.d.ts.map +1 -1
- package/dist/tools/writeTool.js +25 -9
- package/dist/types/commands.d.ts +0 -1
- package/dist/types/commands.d.ts.map +1 -1
- package/dist/types/config.d.ts +4 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/configuration.d.ts +69 -0
- package/dist/types/configuration.d.ts.map +1 -0
- package/dist/types/configuration.js +8 -0
- package/dist/types/core.d.ts +10 -0
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/environment.d.ts +41 -0
- package/dist/types/environment.d.ts.map +1 -1
- package/dist/types/fileSearch.d.ts +5 -0
- package/dist/types/fileSearch.d.ts.map +1 -0
- package/dist/types/fileSearch.js +1 -0
- package/dist/types/hooks.d.ts +11 -2
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/hooks.js +1 -7
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +5 -0
- package/dist/types/lsp.d.ts +90 -0
- package/dist/types/lsp.d.ts.map +1 -0
- package/dist/types/lsp.js +4 -0
- package/dist/types/messaging.d.ts +6 -11
- package/dist/types/messaging.d.ts.map +1 -1
- package/dist/types/permissions.d.ts +35 -0
- package/dist/types/permissions.d.ts.map +1 -0
- package/dist/types/permissions.js +12 -0
- package/dist/types/session.d.ts +1 -6
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/skills.d.ts +1 -0
- package/dist/types/skills.d.ts.map +1 -1
- package/dist/types/tools.d.ts +35 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +4 -0
- package/dist/utils/abortUtils.d.ts +34 -0
- package/dist/utils/abortUtils.d.ts.map +1 -0
- package/dist/utils/abortUtils.js +92 -0
- package/dist/utils/bashHistory.d.ts +4 -0
- package/dist/utils/bashHistory.d.ts.map +1 -1
- package/dist/utils/bashHistory.js +21 -4
- package/dist/utils/builtinSubagents.d.ts +7 -0
- package/dist/utils/builtinSubagents.d.ts.map +1 -0
- package/dist/utils/builtinSubagents.js +65 -0
- package/dist/utils/cacheControlUtils.d.ts +8 -33
- package/dist/utils/cacheControlUtils.d.ts.map +1 -1
- package/dist/utils/cacheControlUtils.js +83 -126
- package/dist/utils/constants.d.ts +0 -12
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +1 -13
- package/dist/utils/convertMessagesForAPI.d.ts +2 -1
- package/dist/utils/convertMessagesForAPI.d.ts.map +1 -1
- package/dist/utils/convertMessagesForAPI.js +33 -14
- package/dist/utils/fileSearch.d.ts +14 -0
- package/dist/utils/fileSearch.d.ts.map +1 -0
- package/dist/utils/fileSearch.js +88 -0
- package/dist/utils/fileUtils.d.ts +14 -2
- package/dist/utils/fileUtils.d.ts.map +1 -1
- package/dist/utils/fileUtils.js +101 -17
- package/dist/utils/globalLogger.d.ts +0 -14
- package/dist/utils/globalLogger.d.ts.map +1 -1
- package/dist/utils/globalLogger.js +0 -16
- package/dist/utils/largeOutputHandler.d.ts +15 -0
- package/dist/utils/largeOutputHandler.d.ts.map +1 -0
- package/dist/utils/largeOutputHandler.js +40 -0
- package/dist/utils/markdownParser.d.ts.map +1 -1
- package/dist/utils/markdownParser.js +1 -17
- package/dist/utils/messageOperations.d.ts +1 -11
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/messageOperations.js +7 -24
- package/dist/utils/pathEncoder.d.ts +4 -0
- package/dist/utils/pathEncoder.d.ts.map +1 -1
- package/dist/utils/pathEncoder.js +16 -9
- package/dist/utils/subagentParser.d.ts +2 -2
- package/dist/utils/subagentParser.d.ts.map +1 -1
- package/dist/utils/subagentParser.js +10 -7
- package/dist/utils/tokenEstimator.d.ts +39 -0
- package/dist/utils/tokenEstimator.d.ts.map +1 -0
- package/dist/utils/tokenEstimator.js +55 -0
- package/package.json +5 -8
- package/src/agent.ts +460 -216
- package/src/index.ts +2 -0
- package/src/managers/aiManager.ts +107 -111
- package/src/managers/backgroundBashManager.ts +4 -3
- package/src/managers/hookManager.ts +44 -39
- package/src/managers/liveConfigManager.ts +524 -138
- package/src/managers/lspManager.ts +434 -0
- package/src/managers/messageManager.ts +73 -103
- package/src/managers/permissionManager.ts +276 -0
- package/src/managers/skillManager.ts +3 -1
- package/src/managers/slashCommandManager.ts +1 -2
- package/src/managers/subagentManager.ts +116 -159
- package/src/managers/toolManager.ts +95 -3
- package/src/services/aiService.ts +207 -26
- package/src/services/configurationService.ts +762 -0
- package/src/services/fileWatcher.ts +5 -6
- package/src/services/hook.ts +50 -631
- package/src/services/jsonlHandler.ts +84 -100
- package/src/services/memory.ts +2 -59
- package/src/services/session.ts +338 -213
- package/src/tools/bashTool.ts +89 -16
- package/src/tools/deleteFileTool.ts +36 -0
- package/src/tools/editTool.ts +41 -7
- package/src/tools/lspTool.ts +760 -0
- package/src/tools/multiEditTool.ts +37 -8
- package/src/tools/readTool.ts +125 -2
- package/src/tools/skillTool.ts +2 -2
- package/src/tools/todoWriteTool.ts +33 -1
- package/src/tools/types.ts +15 -9
- package/src/tools/writeTool.ts +36 -10
- package/src/types/commands.ts +0 -1
- package/src/types/config.ts +5 -0
- package/src/types/configuration.ts +73 -0
- package/src/types/core.ts +11 -0
- package/src/types/environment.ts +44 -0
- package/src/types/fileSearch.ts +4 -0
- package/src/types/hooks.ts +14 -11
- package/src/types/index.ts +5 -0
- package/src/types/lsp.ts +96 -0
- package/src/types/messaging.ts +8 -13
- package/src/types/permissions.ts +48 -0
- package/src/types/session.ts +3 -8
- package/src/types/skills.ts +1 -0
- package/src/types/tools.ts +38 -0
- package/src/utils/abortUtils.ts +118 -0
- package/src/utils/bashHistory.ts +28 -4
- package/src/utils/builtinSubagents.ts +71 -0
- package/src/utils/cacheControlUtils.ts +106 -171
- package/src/utils/constants.ts +1 -16
- package/src/utils/convertMessagesForAPI.ts +38 -14
- package/src/utils/fileSearch.ts +107 -0
- package/src/utils/fileUtils.ts +114 -19
- package/src/utils/globalLogger.ts +0 -17
- package/src/utils/largeOutputHandler.ts +55 -0
- package/src/utils/markdownParser.ts +1 -19
- package/src/utils/messageOperations.ts +7 -35
- package/src/utils/pathEncoder.ts +24 -9
- package/src/utils/subagentParser.ts +11 -8
- package/src/utils/tokenEstimator.ts +68 -0
- package/dist/constants/events.d.ts +0 -28
- package/dist/constants/events.d.ts.map +0 -1
- package/dist/constants/events.js +0 -27
- package/dist/services/configurationWatcher.d.ts +0 -120
- package/dist/services/configurationWatcher.d.ts.map +0 -1
- package/dist/services/configurationWatcher.js +0 -439
- package/dist/services/memoryStore.d.ts +0 -81
- package/dist/services/memoryStore.d.ts.map +0 -1
- package/dist/services/memoryStore.js +0 -200
- package/dist/types/memoryStore.d.ts +0 -82
- package/dist/types/memoryStore.d.ts.map +0 -1
- package/dist/types/memoryStore.js +0 -7
- package/dist/utils/configResolver.d.ts +0 -65
- package/dist/utils/configResolver.d.ts.map +0 -1
- package/dist/utils/configResolver.js +0 -210
- package/src/constants/events.ts +0 -38
- package/src/services/configurationWatcher.ts +0 -622
- package/src/services/memoryStore.ts +0 -279
- package/src/types/memoryStore.ts +0 -94
- package/src/utils/configResolver.ts +0 -302
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
|
|
6
6
|
import { appendFile, readFile, writeFile, stat, mkdir } from "fs/promises";
|
|
7
7
|
import { dirname } from "path";
|
|
8
|
-
import { getLastLine
|
|
8
|
+
import { getLastLine } from "../utils/fileUtils.js";
|
|
9
9
|
|
|
10
10
|
import type { Message } from "../types/index.js";
|
|
11
|
-
import type { SessionMessage,
|
|
11
|
+
import type { SessionMessage, SessionFilename } from "../types/session.js";
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* JSONL write options
|
|
@@ -31,31 +31,14 @@ export class JsonlHandler {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
|
-
* Create a new session file
|
|
34
|
+
* Create a new session file (simplified - no metadata header)
|
|
35
35
|
*/
|
|
36
|
-
async createSession(
|
|
37
|
-
filePath: string,
|
|
38
|
-
sessionId: string,
|
|
39
|
-
workdir: string,
|
|
40
|
-
sessionType: "main" | "subagent" = "main",
|
|
41
|
-
parentSessionId?: string,
|
|
42
|
-
subagentType?: string,
|
|
43
|
-
): Promise<void> {
|
|
44
|
-
const metadataLine: SessionMetadataLine = {
|
|
45
|
-
__meta__: true,
|
|
46
|
-
sessionId,
|
|
47
|
-
sessionType,
|
|
48
|
-
...(parentSessionId && { parentSessionId }),
|
|
49
|
-
...(subagentType && { subagentType }),
|
|
50
|
-
workdir,
|
|
51
|
-
startedAt: new Date().toISOString(),
|
|
52
|
-
};
|
|
53
|
-
|
|
36
|
+
async createSession(filePath: string): Promise<void> {
|
|
54
37
|
// Ensure directory exists
|
|
55
38
|
await this.ensureDirectory(dirname(filePath));
|
|
56
39
|
|
|
57
|
-
//
|
|
58
|
-
await writeFile(filePath,
|
|
40
|
+
// Create empty file (no metadata line needed)
|
|
41
|
+
await writeFile(filePath, "", "utf8");
|
|
59
42
|
}
|
|
60
43
|
|
|
61
44
|
/**
|
|
@@ -131,8 +114,7 @@ export class JsonlHandler {
|
|
|
131
114
|
}
|
|
132
115
|
|
|
133
116
|
/**
|
|
134
|
-
* Read all messages from JSONL file
|
|
135
|
-
* Includes metadata handling for backward compatibility
|
|
117
|
+
* Read all messages from JSONL file (simplified - no metadata handling)
|
|
136
118
|
*/
|
|
137
119
|
async read(filePath: string): Promise<SessionMessage[]> {
|
|
138
120
|
try {
|
|
@@ -148,30 +130,13 @@ export class JsonlHandler {
|
|
|
148
130
|
|
|
149
131
|
const allMessages: SessionMessage[] = [];
|
|
150
132
|
|
|
151
|
-
//
|
|
152
|
-
let
|
|
153
|
-
if (lines.length > 0) {
|
|
154
|
-
try {
|
|
155
|
-
const firstLine = JSON.parse(lines[0]);
|
|
156
|
-
if (firstLine.__meta__ === true) {
|
|
157
|
-
startIndex = 1; // Skip metadata line
|
|
158
|
-
}
|
|
159
|
-
} catch (error) {
|
|
160
|
-
// If first line is not valid JSON, throw error with line number
|
|
161
|
-
if (lines[0].trim().length > 0) {
|
|
162
|
-
// Only throw if line is not empty
|
|
163
|
-
throw new Error(`Invalid JSON at line 1: ${error}`);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// Parse all messages
|
|
169
|
-
for (let i = startIndex; i < lines.length; i++) {
|
|
133
|
+
// Parse all messages (no metadata line to skip)
|
|
134
|
+
for (let i = 0; i < lines.length; i++) {
|
|
170
135
|
const line = lines[i];
|
|
171
136
|
|
|
172
137
|
try {
|
|
173
138
|
const message = JSON.parse(line) as SessionMessage;
|
|
174
|
-
allMessages.push(message);
|
|
139
|
+
if (message.timestamp) allMessages.push(message);
|
|
175
140
|
} catch (error) {
|
|
176
141
|
// Throw error for invalid JSON lines with line number
|
|
177
142
|
throw new Error(`Invalid JSON at line ${i + 1}: ${error}`);
|
|
@@ -188,7 +153,7 @@ export class JsonlHandler {
|
|
|
188
153
|
}
|
|
189
154
|
|
|
190
155
|
/**
|
|
191
|
-
* Get the last message from JSONL file using efficient file reading
|
|
156
|
+
* Get the last message from JSONL file using efficient file reading (simplified)
|
|
192
157
|
*/
|
|
193
158
|
async getLastMessage(filePath: string): Promise<SessionMessage | null> {
|
|
194
159
|
try {
|
|
@@ -211,14 +176,6 @@ export class JsonlHandler {
|
|
|
211
176
|
|
|
212
177
|
try {
|
|
213
178
|
const parsed = JSON.parse(lastLine);
|
|
214
|
-
|
|
215
|
-
// Skip metadata line
|
|
216
|
-
if (parsed.__meta__ === true) {
|
|
217
|
-
// If the last line is metadata, the file only contains metadata
|
|
218
|
-
return null;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
// Found a valid message
|
|
222
179
|
return parsed as SessionMessage;
|
|
223
180
|
} catch (error) {
|
|
224
181
|
throw new Error(`Invalid JSON in last line of "${filePath}": ${error}`);
|
|
@@ -230,52 +187,6 @@ export class JsonlHandler {
|
|
|
230
187
|
}
|
|
231
188
|
}
|
|
232
189
|
|
|
233
|
-
/**
|
|
234
|
-
* Read session metadata from first line (streaming - only reads first line)
|
|
235
|
-
*/
|
|
236
|
-
async readMetadata(filePath: string): Promise<SessionMetadataLine | null> {
|
|
237
|
-
try {
|
|
238
|
-
// First check if file exists
|
|
239
|
-
try {
|
|
240
|
-
await stat(filePath);
|
|
241
|
-
} catch (err) {
|
|
242
|
-
if ((err as NodeJS.ErrnoException).code === "ENOENT") {
|
|
243
|
-
return null;
|
|
244
|
-
}
|
|
245
|
-
throw err;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
// Read the first line efficiently
|
|
249
|
-
const firstLine = await readFirstLine(filePath);
|
|
250
|
-
|
|
251
|
-
if (!firstLine) {
|
|
252
|
-
return null; // Empty file or first line
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
try {
|
|
256
|
-
const parsed = JSON.parse(firstLine);
|
|
257
|
-
if (parsed.__meta__ === true) {
|
|
258
|
-
return parsed as SessionMetadataLine;
|
|
259
|
-
} else {
|
|
260
|
-
return null; // First line is not metadata
|
|
261
|
-
}
|
|
262
|
-
} catch {
|
|
263
|
-
return null; // Invalid JSON on first line
|
|
264
|
-
}
|
|
265
|
-
} catch (error) {
|
|
266
|
-
throw new Error(`Failed to read metadata from "${filePath}": ${error}`);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* Check if a session file has metadata (first line check only)
|
|
272
|
-
* Very efficient - only reads first line
|
|
273
|
-
*/
|
|
274
|
-
async hasMetadata(filePath: string): Promise<boolean> {
|
|
275
|
-
const metadata = await this.readMetadata(filePath);
|
|
276
|
-
return metadata !== null;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
190
|
/**
|
|
280
191
|
* Validate messages before writing
|
|
281
192
|
*/
|
|
@@ -316,4 +227,77 @@ export class JsonlHandler {
|
|
|
316
227
|
}
|
|
317
228
|
}
|
|
318
229
|
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Parse session metadata from filename
|
|
233
|
+
* @param filePath - Path to the session file
|
|
234
|
+
* @returns Parsed session filename metadata
|
|
235
|
+
*/
|
|
236
|
+
parseSessionFilename(filePath: string): SessionFilename {
|
|
237
|
+
// Extract filename from path
|
|
238
|
+
const filename = filePath.split("/").pop() || "";
|
|
239
|
+
|
|
240
|
+
// Check if it's a subagent session
|
|
241
|
+
const subagentMatch = filename.match(
|
|
242
|
+
/^subagent-([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/,
|
|
243
|
+
);
|
|
244
|
+
if (subagentMatch) {
|
|
245
|
+
return {
|
|
246
|
+
sessionId: subagentMatch[1],
|
|
247
|
+
sessionType: "subagent",
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Check if it's a main session
|
|
252
|
+
const mainMatch = filename.match(
|
|
253
|
+
/^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/,
|
|
254
|
+
);
|
|
255
|
+
if (mainMatch) {
|
|
256
|
+
return {
|
|
257
|
+
sessionId: mainMatch[1],
|
|
258
|
+
sessionType: "main",
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
throw new Error(`Invalid session filename format: ${filename}`);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Validate filename format
|
|
267
|
+
* @param filename - Filename to validate
|
|
268
|
+
* @returns True if valid, false otherwise
|
|
269
|
+
*/
|
|
270
|
+
isValidSessionFilename(filename: string): boolean {
|
|
271
|
+
// UUID validation patterns
|
|
272
|
+
const uuidPattern =
|
|
273
|
+
/^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/;
|
|
274
|
+
const subagentPattern =
|
|
275
|
+
/^subagent-([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/;
|
|
276
|
+
|
|
277
|
+
return uuidPattern.test(filename) || subagentPattern.test(filename);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Generate simple filename for sessions
|
|
282
|
+
* @param sessionId - UUID session identifier
|
|
283
|
+
* @param sessionType - Type of session ("main" or "subagent")
|
|
284
|
+
* @returns Generated filename
|
|
285
|
+
*/
|
|
286
|
+
generateSessionFilename(
|
|
287
|
+
sessionId: string,
|
|
288
|
+
sessionType: "main" | "subagent",
|
|
289
|
+
): string {
|
|
290
|
+
// Validate sessionId is a valid UUID
|
|
291
|
+
const uuidPattern =
|
|
292
|
+
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
293
|
+
if (!uuidPattern.test(sessionId)) {
|
|
294
|
+
throw new Error(`Invalid session ID format: ${sessionId}`);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
if (sessionType === "subagent") {
|
|
298
|
+
return `subagent-${sessionId}.jsonl`;
|
|
299
|
+
} else {
|
|
300
|
+
return `${sessionId}.jsonl`;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
319
303
|
}
|
package/src/services/memory.ts
CHANGED
|
@@ -1,28 +1,8 @@
|
|
|
1
1
|
import { promises as fs } from "fs";
|
|
2
2
|
import path from "path";
|
|
3
3
|
import { USER_MEMORY_FILE, DATA_DIRECTORY } from "../utils/constants.js";
|
|
4
|
-
import { MemoryStoreService } from "./memoryStore.js";
|
|
5
4
|
import { logger } from "../utils/globalLogger.js";
|
|
6
5
|
|
|
7
|
-
// Global memory store instance for project memory files
|
|
8
|
-
let globalMemoryStore: MemoryStoreService | null = null;
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Initialize global memory store
|
|
12
|
-
*/
|
|
13
|
-
export const initializeMemoryStore = (
|
|
14
|
-
memoryStore: MemoryStoreService,
|
|
15
|
-
): void => {
|
|
16
|
-
globalMemoryStore = memoryStore;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Get current memory store instance
|
|
21
|
-
*/
|
|
22
|
-
export const getMemoryStore = (): MemoryStoreService | null => {
|
|
23
|
-
return globalMemoryStore;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
6
|
// Project memory related methods
|
|
27
7
|
export const isMemoryMessage = (message: string): boolean => {
|
|
28
8
|
return message.trim().startsWith("#");
|
|
@@ -65,20 +45,6 @@ export const addMemory = async (
|
|
|
65
45
|
// Write file
|
|
66
46
|
await fs.writeFile(memoryFilePath, updatedContent, "utf-8");
|
|
67
47
|
|
|
68
|
-
// Update memory store if available
|
|
69
|
-
if (globalMemoryStore) {
|
|
70
|
-
try {
|
|
71
|
-
await globalMemoryStore.updateContent(memoryFilePath);
|
|
72
|
-
} catch (error) {
|
|
73
|
-
logger.warn(
|
|
74
|
-
`Failed to update memory store for ${memoryFilePath}:`,
|
|
75
|
-
error,
|
|
76
|
-
);
|
|
77
|
-
}
|
|
78
|
-
} else {
|
|
79
|
-
logger.debug("No global memory store available, skipping store update");
|
|
80
|
-
}
|
|
81
|
-
|
|
82
48
|
logger.debug(`Memory added to ${memoryFilePath}:`, message);
|
|
83
49
|
} catch (error) {
|
|
84
50
|
logger.error("Failed to add memory:", error);
|
|
@@ -156,34 +122,11 @@ export const getUserMemoryContent = async (): Promise<string> => {
|
|
|
156
122
|
}
|
|
157
123
|
};
|
|
158
124
|
|
|
159
|
-
// Read project memory file content
|
|
125
|
+
// Read project memory file content
|
|
160
126
|
export const readMemoryFile = async (workdir: string): Promise<string> => {
|
|
161
127
|
const memoryFilePath = path.join(workdir, "AGENTS.md");
|
|
162
128
|
|
|
163
|
-
//
|
|
164
|
-
if (globalMemoryStore) {
|
|
165
|
-
logger.debug("Using memory store for optimized access", { memoryFilePath });
|
|
166
|
-
try {
|
|
167
|
-
const content = await globalMemoryStore.getContent(memoryFilePath);
|
|
168
|
-
logger.debug("Memory content retrieved from store successfully", {
|
|
169
|
-
memoryFilePath,
|
|
170
|
-
contentLength: content.length,
|
|
171
|
-
});
|
|
172
|
-
return content;
|
|
173
|
-
} catch (error) {
|
|
174
|
-
// Fallback to direct file access on memory store error
|
|
175
|
-
logger.warn(
|
|
176
|
-
`Memory store access failed for ${memoryFilePath}, falling back to file system:`,
|
|
177
|
-
error,
|
|
178
|
-
);
|
|
179
|
-
}
|
|
180
|
-
} else {
|
|
181
|
-
logger.debug("No memory store available, using direct file access", {
|
|
182
|
-
memoryFilePath,
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// Fallback to direct file access (original behavior)
|
|
129
|
+
// Direct file access
|
|
187
130
|
try {
|
|
188
131
|
const content = await fs.readFile(memoryFilePath, "utf-8");
|
|
189
132
|
logger.debug("Memory file read successfully via direct file access", {
|