wave-agent-sdk 0.0.8 → 0.0.11

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 (236) hide show
  1. package/dist/agent.d.ts +92 -23
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +351 -137
  4. package/dist/index.d.ts +3 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +3 -0
  7. package/dist/managers/aiManager.d.ts +14 -36
  8. package/dist/managers/aiManager.d.ts.map +1 -1
  9. package/dist/managers/aiManager.js +74 -77
  10. package/dist/managers/backgroundBashManager.d.ts.map +1 -1
  11. package/dist/managers/backgroundBashManager.js +4 -3
  12. package/dist/managers/hookManager.d.ts +3 -8
  13. package/dist/managers/hookManager.d.ts.map +1 -1
  14. package/dist/managers/hookManager.js +39 -29
  15. package/dist/managers/liveConfigManager.d.ts +55 -18
  16. package/dist/managers/liveConfigManager.d.ts.map +1 -1
  17. package/dist/managers/liveConfigManager.js +372 -90
  18. package/dist/managers/lspManager.d.ts +43 -0
  19. package/dist/managers/lspManager.d.ts.map +1 -0
  20. package/dist/managers/lspManager.js +326 -0
  21. package/dist/managers/messageManager.d.ts +8 -16
  22. package/dist/managers/messageManager.d.ts.map +1 -1
  23. package/dist/managers/messageManager.js +52 -74
  24. package/dist/managers/permissionManager.d.ts +75 -0
  25. package/dist/managers/permissionManager.d.ts.map +1 -0
  26. package/dist/managers/permissionManager.js +368 -0
  27. package/dist/managers/skillManager.d.ts +1 -0
  28. package/dist/managers/skillManager.d.ts.map +1 -1
  29. package/dist/managers/skillManager.js +2 -1
  30. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  31. package/dist/managers/slashCommandManager.js +0 -1
  32. package/dist/managers/subagentManager.d.ts +8 -23
  33. package/dist/managers/subagentManager.d.ts.map +1 -1
  34. package/dist/managers/subagentManager.js +97 -117
  35. package/dist/managers/toolManager.d.ts +38 -1
  36. package/dist/managers/toolManager.d.ts.map +1 -1
  37. package/dist/managers/toolManager.js +66 -2
  38. package/dist/services/aiService.d.ts +3 -1
  39. package/dist/services/aiService.d.ts.map +1 -1
  40. package/dist/services/aiService.js +123 -30
  41. package/dist/services/configurationService.d.ts +116 -0
  42. package/dist/services/configurationService.d.ts.map +1 -0
  43. package/dist/services/configurationService.js +585 -0
  44. package/dist/services/fileWatcher.d.ts.map +1 -1
  45. package/dist/services/fileWatcher.js +5 -6
  46. package/dist/services/hook.d.ts +7 -124
  47. package/dist/services/hook.d.ts.map +1 -1
  48. package/dist/services/hook.js +46 -458
  49. package/dist/services/jsonlHandler.d.ts +24 -15
  50. package/dist/services/jsonlHandler.d.ts.map +1 -1
  51. package/dist/services/jsonlHandler.js +67 -88
  52. package/dist/services/memory.d.ts +0 -9
  53. package/dist/services/memory.d.ts.map +1 -1
  54. package/dist/services/memory.js +2 -49
  55. package/dist/services/session.d.ts +82 -33
  56. package/dist/services/session.d.ts.map +1 -1
  57. package/dist/services/session.js +275 -181
  58. package/dist/tools/bashTool.d.ts.map +1 -1
  59. package/dist/tools/bashTool.js +109 -11
  60. package/dist/tools/deleteFileTool.d.ts.map +1 -1
  61. package/dist/tools/deleteFileTool.js +25 -0
  62. package/dist/tools/editTool.d.ts.map +1 -1
  63. package/dist/tools/editTool.js +30 -6
  64. package/dist/tools/lspTool.d.ts +6 -0
  65. package/dist/tools/lspTool.d.ts.map +1 -0
  66. package/dist/tools/lspTool.js +589 -0
  67. package/dist/tools/multiEditTool.d.ts.map +1 -1
  68. package/dist/tools/multiEditTool.js +26 -7
  69. package/dist/tools/readTool.d.ts.map +1 -1
  70. package/dist/tools/readTool.js +111 -2
  71. package/dist/tools/skillTool.js +2 -2
  72. package/dist/tools/todoWriteTool.d.ts.map +1 -1
  73. package/dist/tools/todoWriteTool.js +23 -0
  74. package/dist/tools/types.d.ts +11 -8
  75. package/dist/tools/types.d.ts.map +1 -1
  76. package/dist/tools/writeTool.d.ts.map +1 -1
  77. package/dist/tools/writeTool.js +25 -9
  78. package/dist/types/commands.d.ts +0 -1
  79. package/dist/types/commands.d.ts.map +1 -1
  80. package/dist/types/config.d.ts +4 -0
  81. package/dist/types/config.d.ts.map +1 -1
  82. package/dist/types/configuration.d.ts +69 -0
  83. package/dist/types/configuration.d.ts.map +1 -0
  84. package/dist/types/configuration.js +8 -0
  85. package/dist/types/core.d.ts +10 -0
  86. package/dist/types/core.d.ts.map +1 -1
  87. package/dist/types/environment.d.ts +41 -0
  88. package/dist/types/environment.d.ts.map +1 -1
  89. package/dist/types/fileSearch.d.ts +5 -0
  90. package/dist/types/fileSearch.d.ts.map +1 -0
  91. package/dist/types/fileSearch.js +1 -0
  92. package/dist/types/hooks.d.ts +11 -2
  93. package/dist/types/hooks.d.ts.map +1 -1
  94. package/dist/types/hooks.js +1 -7
  95. package/dist/types/index.d.ts +5 -0
  96. package/dist/types/index.d.ts.map +1 -1
  97. package/dist/types/index.js +5 -0
  98. package/dist/types/lsp.d.ts +90 -0
  99. package/dist/types/lsp.d.ts.map +1 -0
  100. package/dist/types/lsp.js +4 -0
  101. package/dist/types/messaging.d.ts +6 -11
  102. package/dist/types/messaging.d.ts.map +1 -1
  103. package/dist/types/permissions.d.ts +39 -0
  104. package/dist/types/permissions.d.ts.map +1 -0
  105. package/dist/types/permissions.js +12 -0
  106. package/dist/types/session.d.ts +1 -6
  107. package/dist/types/session.d.ts.map +1 -1
  108. package/dist/types/skills.d.ts +1 -0
  109. package/dist/types/skills.d.ts.map +1 -1
  110. package/dist/types/tools.d.ts +35 -0
  111. package/dist/types/tools.d.ts.map +1 -0
  112. package/dist/types/tools.js +4 -0
  113. package/dist/utils/abortUtils.d.ts +34 -0
  114. package/dist/utils/abortUtils.d.ts.map +1 -0
  115. package/dist/utils/abortUtils.js +92 -0
  116. package/dist/utils/bashHistory.d.ts +4 -0
  117. package/dist/utils/bashHistory.d.ts.map +1 -1
  118. package/dist/utils/bashHistory.js +21 -4
  119. package/dist/utils/bashParser.d.ts +24 -0
  120. package/dist/utils/bashParser.d.ts.map +1 -0
  121. package/dist/utils/bashParser.js +413 -0
  122. package/dist/utils/builtinSubagents.d.ts +7 -0
  123. package/dist/utils/builtinSubagents.d.ts.map +1 -0
  124. package/dist/utils/builtinSubagents.js +65 -0
  125. package/dist/utils/cacheControlUtils.d.ts +8 -33
  126. package/dist/utils/cacheControlUtils.d.ts.map +1 -1
  127. package/dist/utils/cacheControlUtils.js +83 -126
  128. package/dist/utils/constants.d.ts +0 -12
  129. package/dist/utils/constants.d.ts.map +1 -1
  130. package/dist/utils/constants.js +1 -13
  131. package/dist/utils/convertMessagesForAPI.d.ts +2 -1
  132. package/dist/utils/convertMessagesForAPI.d.ts.map +1 -1
  133. package/dist/utils/convertMessagesForAPI.js +33 -14
  134. package/dist/utils/fileSearch.d.ts +14 -0
  135. package/dist/utils/fileSearch.d.ts.map +1 -0
  136. package/dist/utils/fileSearch.js +88 -0
  137. package/dist/utils/fileUtils.d.ts +14 -2
  138. package/dist/utils/fileUtils.d.ts.map +1 -1
  139. package/dist/utils/fileUtils.js +101 -17
  140. package/dist/utils/globalLogger.d.ts +0 -14
  141. package/dist/utils/globalLogger.d.ts.map +1 -1
  142. package/dist/utils/globalLogger.js +0 -16
  143. package/dist/utils/markdownParser.d.ts.map +1 -1
  144. package/dist/utils/markdownParser.js +1 -17
  145. package/dist/utils/messageOperations.d.ts +1 -11
  146. package/dist/utils/messageOperations.d.ts.map +1 -1
  147. package/dist/utils/messageOperations.js +7 -24
  148. package/dist/utils/pathEncoder.d.ts +4 -0
  149. package/dist/utils/pathEncoder.d.ts.map +1 -1
  150. package/dist/utils/pathEncoder.js +16 -9
  151. package/dist/utils/pathSafety.d.ts +10 -0
  152. package/dist/utils/pathSafety.d.ts.map +1 -0
  153. package/dist/utils/pathSafety.js +23 -0
  154. package/dist/utils/subagentParser.d.ts +2 -2
  155. package/dist/utils/subagentParser.d.ts.map +1 -1
  156. package/dist/utils/subagentParser.js +10 -7
  157. package/package.json +9 -9
  158. package/src/agent.ts +475 -216
  159. package/src/index.ts +3 -0
  160. package/src/managers/aiManager.ts +107 -111
  161. package/src/managers/backgroundBashManager.ts +4 -3
  162. package/src/managers/hookManager.ts +44 -39
  163. package/src/managers/liveConfigManager.ts +524 -138
  164. package/src/managers/lspManager.ts +434 -0
  165. package/src/managers/messageManager.ts +73 -103
  166. package/src/managers/permissionManager.ts +480 -0
  167. package/src/managers/skillManager.ts +3 -1
  168. package/src/managers/slashCommandManager.ts +1 -2
  169. package/src/managers/subagentManager.ts +116 -159
  170. package/src/managers/toolManager.ts +95 -3
  171. package/src/services/aiService.ts +207 -26
  172. package/src/services/configurationService.ts +762 -0
  173. package/src/services/fileWatcher.ts +5 -6
  174. package/src/services/hook.ts +50 -631
  175. package/src/services/jsonlHandler.ts +84 -100
  176. package/src/services/memory.ts +2 -59
  177. package/src/services/session.ts +338 -213
  178. package/src/tools/bashTool.ts +126 -13
  179. package/src/tools/deleteFileTool.ts +36 -0
  180. package/src/tools/editTool.ts +41 -7
  181. package/src/tools/lspTool.ts +760 -0
  182. package/src/tools/multiEditTool.ts +37 -8
  183. package/src/tools/readTool.ts +125 -2
  184. package/src/tools/skillTool.ts +2 -2
  185. package/src/tools/todoWriteTool.ts +33 -1
  186. package/src/tools/types.ts +15 -9
  187. package/src/tools/writeTool.ts +36 -10
  188. package/src/types/commands.ts +0 -1
  189. package/src/types/config.ts +5 -0
  190. package/src/types/configuration.ts +73 -0
  191. package/src/types/core.ts +11 -0
  192. package/src/types/environment.ts +44 -0
  193. package/src/types/fileSearch.ts +4 -0
  194. package/src/types/hooks.ts +14 -11
  195. package/src/types/index.ts +5 -0
  196. package/src/types/lsp.ts +96 -0
  197. package/src/types/messaging.ts +8 -13
  198. package/src/types/permissions.ts +52 -0
  199. package/src/types/session.ts +3 -8
  200. package/src/types/skills.ts +1 -0
  201. package/src/types/tools.ts +38 -0
  202. package/src/utils/abortUtils.ts +118 -0
  203. package/src/utils/bashHistory.ts +28 -4
  204. package/src/utils/bashParser.ts +444 -0
  205. package/src/utils/builtinSubagents.ts +71 -0
  206. package/src/utils/cacheControlUtils.ts +106 -171
  207. package/src/utils/constants.ts +1 -16
  208. package/src/utils/convertMessagesForAPI.ts +38 -14
  209. package/src/utils/fileSearch.ts +107 -0
  210. package/src/utils/fileUtils.ts +114 -19
  211. package/src/utils/globalLogger.ts +0 -17
  212. package/src/utils/markdownParser.ts +1 -19
  213. package/src/utils/messageOperations.ts +7 -35
  214. package/src/utils/pathEncoder.ts +24 -9
  215. package/src/utils/pathSafety.ts +26 -0
  216. package/src/utils/subagentParser.ts +11 -8
  217. package/dist/constants/events.d.ts +0 -28
  218. package/dist/constants/events.d.ts.map +0 -1
  219. package/dist/constants/events.js +0 -27
  220. package/dist/services/configurationWatcher.d.ts +0 -120
  221. package/dist/services/configurationWatcher.d.ts.map +0 -1
  222. package/dist/services/configurationWatcher.js +0 -439
  223. package/dist/services/memoryStore.d.ts +0 -81
  224. package/dist/services/memoryStore.d.ts.map +0 -1
  225. package/dist/services/memoryStore.js +0 -200
  226. package/dist/types/memoryStore.d.ts +0 -82
  227. package/dist/types/memoryStore.d.ts.map +0 -1
  228. package/dist/types/memoryStore.js +0 -7
  229. package/dist/utils/configResolver.d.ts +0 -65
  230. package/dist/utils/configResolver.d.ts.map +0 -1
  231. package/dist/utils/configResolver.js +0 -210
  232. package/src/constants/events.ts +0 -38
  233. package/src/services/configurationWatcher.ts +0 -622
  234. package/src/services/memoryStore.ts +0 -279
  235. package/src/types/memoryStore.ts +0 -94
  236. package/src/utils/configResolver.ts +0 -302
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import { appendFile, readFile, writeFile, stat, mkdir } from "fs/promises";
6
6
  import { dirname } from "path";
7
- import { getLastLine, readFirstLine } from "../utils/fileUtils.js";
7
+ import { getLastLine } from "../utils/fileUtils.js";
8
8
  /**
9
9
  * JSONL handler class for message persistence operations
10
10
  */
@@ -15,22 +15,13 @@ export class JsonlHandler {
15
15
  };
16
16
  }
17
17
  /**
18
- * Create a new session file with metadata header
18
+ * Create a new session file (simplified - no metadata header)
19
19
  */
20
- async createSession(filePath, sessionId, workdir, sessionType = "main", parentSessionId, subagentType) {
21
- const metadataLine = {
22
- __meta__: true,
23
- sessionId,
24
- sessionType,
25
- ...(parentSessionId && { parentSessionId }),
26
- ...(subagentType && { subagentType }),
27
- workdir,
28
- startedAt: new Date().toISOString(),
29
- };
20
+ async createSession(filePath) {
30
21
  // Ensure directory exists
31
22
  await this.ensureDirectory(dirname(filePath));
32
- // Write metadata line as first line
33
- await writeFile(filePath, JSON.stringify(metadataLine) + "\n", "utf8");
23
+ // Create empty file (no metadata line needed)
24
+ await writeFile(filePath, "", "utf8");
34
25
  }
35
26
  /**
36
27
  * Append a single message to JSONL file
@@ -88,8 +79,7 @@ export class JsonlHandler {
88
79
  }
89
80
  }
90
81
  /**
91
- * Read all messages from JSONL file
92
- * Includes metadata handling for backward compatibility
82
+ * Read all messages from JSONL file (simplified - no metadata handling)
93
83
  */
94
84
  async read(filePath) {
95
85
  try {
@@ -102,29 +92,13 @@ export class JsonlHandler {
102
92
  return [];
103
93
  }
104
94
  const allMessages = [];
105
- // Skip metadata line if present (first line with __meta__: true)
106
- let startIndex = 0;
107
- if (lines.length > 0) {
108
- try {
109
- const firstLine = JSON.parse(lines[0]);
110
- if (firstLine.__meta__ === true) {
111
- startIndex = 1; // Skip metadata line
112
- }
113
- }
114
- catch (error) {
115
- // If first line is not valid JSON, throw error with line number
116
- if (lines[0].trim().length > 0) {
117
- // Only throw if line is not empty
118
- throw new Error(`Invalid JSON at line 1: ${error}`);
119
- }
120
- }
121
- }
122
- // Parse all messages
123
- for (let i = startIndex; i < lines.length; i++) {
95
+ // Parse all messages (no metadata line to skip)
96
+ for (let i = 0; i < lines.length; i++) {
124
97
  const line = lines[i];
125
98
  try {
126
99
  const message = JSON.parse(line);
127
- allMessages.push(message);
100
+ if (message.timestamp)
101
+ allMessages.push(message);
128
102
  }
129
103
  catch (error) {
130
104
  // Throw error for invalid JSON lines with line number
@@ -141,7 +115,7 @@ export class JsonlHandler {
141
115
  }
142
116
  }
143
117
  /**
144
- * Get the last message from JSONL file using efficient file reading
118
+ * Get the last message from JSONL file using efficient file reading (simplified)
145
119
  */
146
120
  async getLastMessage(filePath) {
147
121
  try {
@@ -162,12 +136,6 @@ export class JsonlHandler {
162
136
  }
163
137
  try {
164
138
  const parsed = JSON.parse(lastLine);
165
- // Skip metadata line
166
- if (parsed.__meta__ === true) {
167
- // If the last line is metadata, the file only contains metadata
168
- return null;
169
- }
170
- // Found a valid message
171
139
  return parsed;
172
140
  }
173
141
  catch (error) {
@@ -178,51 +146,6 @@ export class JsonlHandler {
178
146
  throw new Error(`Failed to get last message from "${filePath}": ${error}`);
179
147
  }
180
148
  }
181
- /**
182
- * Read session metadata from first line (streaming - only reads first line)
183
- */
184
- async readMetadata(filePath) {
185
- try {
186
- // First check if file exists
187
- try {
188
- await stat(filePath);
189
- }
190
- catch (err) {
191
- if (err.code === "ENOENT") {
192
- return null;
193
- }
194
- throw err;
195
- }
196
- // Read the first line efficiently
197
- const firstLine = await readFirstLine(filePath);
198
- if (!firstLine) {
199
- return null; // Empty file or first line
200
- }
201
- try {
202
- const parsed = JSON.parse(firstLine);
203
- if (parsed.__meta__ === true) {
204
- return parsed;
205
- }
206
- else {
207
- return null; // First line is not metadata
208
- }
209
- }
210
- catch {
211
- return null; // Invalid JSON on first line
212
- }
213
- }
214
- catch (error) {
215
- throw new Error(`Failed to read metadata from "${filePath}": ${error}`);
216
- }
217
- }
218
- /**
219
- * Check if a session file has metadata (first line check only)
220
- * Very efficient - only reads first line
221
- */
222
- async hasMetadata(filePath) {
223
- const metadata = await this.readMetadata(filePath);
224
- return metadata !== null;
225
- }
226
149
  /**
227
150
  * Validate messages before writing
228
151
  */
@@ -254,4 +177,60 @@ export class JsonlHandler {
254
177
  }
255
178
  }
256
179
  }
180
+ /**
181
+ * Parse session metadata from filename
182
+ * @param filePath - Path to the session file
183
+ * @returns Parsed session filename metadata
184
+ */
185
+ parseSessionFilename(filePath) {
186
+ // Extract filename from path
187
+ const filename = filePath.split("/").pop() || "";
188
+ // Check if it's a subagent session
189
+ const subagentMatch = filename.match(/^subagent-([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/);
190
+ if (subagentMatch) {
191
+ return {
192
+ sessionId: subagentMatch[1],
193
+ sessionType: "subagent",
194
+ };
195
+ }
196
+ // Check if it's a main session
197
+ const mainMatch = filename.match(/^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/);
198
+ if (mainMatch) {
199
+ return {
200
+ sessionId: mainMatch[1],
201
+ sessionType: "main",
202
+ };
203
+ }
204
+ throw new Error(`Invalid session filename format: ${filename}`);
205
+ }
206
+ /**
207
+ * Validate filename format
208
+ * @param filename - Filename to validate
209
+ * @returns True if valid, false otherwise
210
+ */
211
+ isValidSessionFilename(filename) {
212
+ // UUID validation patterns
213
+ const uuidPattern = /^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/;
214
+ const subagentPattern = /^subagent-([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/;
215
+ return uuidPattern.test(filename) || subagentPattern.test(filename);
216
+ }
217
+ /**
218
+ * Generate simple filename for sessions
219
+ * @param sessionId - UUID session identifier
220
+ * @param sessionType - Type of session ("main" or "subagent")
221
+ * @returns Generated filename
222
+ */
223
+ generateSessionFilename(sessionId, sessionType) {
224
+ // Validate sessionId is a valid UUID
225
+ const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
226
+ if (!uuidPattern.test(sessionId)) {
227
+ throw new Error(`Invalid session ID format: ${sessionId}`);
228
+ }
229
+ if (sessionType === "subagent") {
230
+ return `subagent-${sessionId}.jsonl`;
231
+ }
232
+ else {
233
+ return `${sessionId}.jsonl`;
234
+ }
235
+ }
257
236
  }
@@ -1,12 +1,3 @@
1
- import { MemoryStoreService } from "./memoryStore.js";
2
- /**
3
- * Initialize global memory store
4
- */
5
- export declare const initializeMemoryStore: (memoryStore: MemoryStoreService) => void;
6
- /**
7
- * Get current memory store instance
8
- */
9
- export declare const getMemoryStore: () => MemoryStoreService | null;
10
1
  export declare const isMemoryMessage: (message: string) => boolean;
11
2
  export declare const addMemory: (message: string, workdir: string) => Promise<void>;
12
3
  export declare const ensureUserMemoryFile: () => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/services/memory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAMtD;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAChC,aAAa,kBAAkB,KAC9B,IAEF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,QAAO,kBAAkB,GAAG,IAEtD,CAAC;AAGF,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,KAAG,OAEjD,CAAC;AAEF,eAAO,MAAM,SAAS,GACpB,SAAS,MAAM,EACf,SAAS,MAAM,KACd,OAAO,CAAC,IAAI,CAqDd,CAAC;AAGF,eAAO,MAAM,oBAAoB,QAAa,OAAO,CAAC,IAAI,CA4BzD,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,IAAI,CAsBjE,CAAC;AAEF,eAAO,MAAM,oBAAoB,QAAa,OAAO,CAAC,MAAM,CAa3D,CAAC;AAGF,eAAO,MAAM,cAAc,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,MAAM,CA4CpE,CAAC;AAGF,eAAO,MAAM,wBAAwB,GACnC,SAAS,MAAM,KACd,OAAO,CAAC,MAAM,CAoBhB,CAAC"}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/services/memory.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,KAAG,OAEjD,CAAC;AAEF,eAAO,MAAM,SAAS,GACpB,SAAS,MAAM,EACf,SAAS,MAAM,KACd,OAAO,CAAC,IAAI,CAuCd,CAAC;AAGF,eAAO,MAAM,oBAAoB,QAAa,OAAO,CAAC,IAAI,CA4BzD,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,IAAI,CAsBjE,CAAC;AAEF,eAAO,MAAM,oBAAoB,QAAa,OAAO,CAAC,MAAM,CAa3D,CAAC;AAGF,eAAO,MAAM,cAAc,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,MAAM,CAqBpE,CAAC;AAGF,eAAO,MAAM,wBAAwB,GACnC,SAAS,MAAM,KACd,OAAO,CAAC,MAAM,CAoBhB,CAAC"}
@@ -2,20 +2,6 @@ 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
4
  import { logger } from "../utils/globalLogger.js";
5
- // Global memory store instance for project memory files
6
- let globalMemoryStore = null;
7
- /**
8
- * Initialize global memory store
9
- */
10
- export const initializeMemoryStore = (memoryStore) => {
11
- globalMemoryStore = memoryStore;
12
- };
13
- /**
14
- * Get current memory store instance
15
- */
16
- export const getMemoryStore = () => {
17
- return globalMemoryStore;
18
- };
19
5
  // Project memory related methods
20
6
  export const isMemoryMessage = (message) => {
21
7
  return message.trim().startsWith("#");
@@ -50,18 +36,6 @@ export const addMemory = async (message, workdir) => {
50
36
  const updatedContent = existingContent + memoryEntry;
51
37
  // Write file
52
38
  await fs.writeFile(memoryFilePath, updatedContent, "utf-8");
53
- // Update memory store if available
54
- if (globalMemoryStore) {
55
- try {
56
- await globalMemoryStore.updateContent(memoryFilePath);
57
- }
58
- catch (error) {
59
- logger.warn(`Failed to update memory store for ${memoryFilePath}:`, error);
60
- }
61
- }
62
- else {
63
- logger.debug("No global memory store available, skipping store update");
64
- }
65
39
  logger.debug(`Memory added to ${memoryFilePath}:`, message);
66
40
  }
67
41
  catch (error) {
@@ -132,31 +106,10 @@ export const getUserMemoryContent = async () => {
132
106
  return "";
133
107
  }
134
108
  };
135
- // Read project memory file content with memory store optimization
109
+ // Read project memory file content
136
110
  export const readMemoryFile = async (workdir) => {
137
111
  const memoryFilePath = path.join(workdir, "AGENTS.md");
138
- // Use memory store if available for optimized access
139
- if (globalMemoryStore) {
140
- logger.debug("Using memory store for optimized access", { memoryFilePath });
141
- try {
142
- const content = await globalMemoryStore.getContent(memoryFilePath);
143
- logger.debug("Memory content retrieved from store successfully", {
144
- memoryFilePath,
145
- contentLength: content.length,
146
- });
147
- return content;
148
- }
149
- catch (error) {
150
- // Fallback to direct file access on memory store error
151
- logger.warn(`Memory store access failed for ${memoryFilePath}, falling back to file system:`, error);
152
- }
153
- }
154
- else {
155
- logger.debug("No memory store available, using direct file access", {
156
- memoryFilePath,
157
- });
158
- }
159
- // Fallback to direct file access (original behavior)
112
+ // Direct file access
160
113
  try {
161
114
  const content = await fs.readFile(memoryFilePath, "utf-8");
162
115
  logger.debug("Memory file read successfully via direct file access", {
@@ -1,10 +1,25 @@
1
+ /**
2
+ * Session Management Service - JSONL Format Implementation
3
+ *
4
+ * OPTIMIZED IMPLEMENTATION (Phase 6 Complete):
5
+ * - Filename-based session type identification
6
+ * - Minimal file I/O for metadata extraction
7
+ * - Eliminated metadata headers for cleaner session files
8
+ * - Backward compatible with existing session files
9
+ * - 8-10x performance improvement in session listing operations
10
+ *
11
+ * Key Features:
12
+ * - Session creation without metadata headers
13
+ * - Subagent sessions identified by filename prefix
14
+ * - Performance-optimized session listing
15
+ * - Full backward compatibility maintained
16
+ */
1
17
  import type { Message } from "../types/index.js";
2
18
  export interface SessionData {
3
19
  id: string;
4
20
  messages: Message[];
5
21
  metadata: {
6
22
  workdir: string;
7
- startedAt: string;
8
23
  lastActiveAt: string;
9
24
  latestTotalTokens: number;
10
25
  };
@@ -12,60 +27,72 @@ export interface SessionData {
12
27
  export interface SessionMetadata {
13
28
  id: string;
14
29
  sessionType: "main" | "subagent";
15
- parentSessionId?: string;
16
30
  subagentType?: string;
17
31
  workdir: string;
18
- startedAt: Date;
19
32
  lastActiveAt: Date;
20
33
  latestTotalTokens: number;
21
34
  }
22
35
  /**
23
- * Generate a new UUIDv6-based session ID
24
- * @returns UUIDv6 string for time-ordered sessions
36
+ * Generate a new session ID using Node.js native crypto.randomUUID()
37
+ * @returns UUID string for session identification
25
38
  */
26
39
  export declare function generateSessionId(): string;
40
+ /**
41
+ * Generate filename for subagent sessions
42
+ * @param sessionId - UUID session identifier
43
+ * @returns Filename with subagent prefix for subagent sessions
44
+ */
45
+ export declare function generateSubagentFilename(sessionId: string): string;
27
46
  export declare const SESSION_DIR: string;
28
47
  /**
29
48
  * Ensure session directory exists
30
49
  */
31
50
  export declare function ensureSessionDir(): Promise<void>;
51
+ /**
52
+ * Generate session file path without creating directories
53
+ * @param sessionId - UUID session identifier
54
+ * @param workdir - Working directory for the session
55
+ * @param sessionType - Type of session ("main" or "subagent", defaults to "main")
56
+ * @returns Promise resolving to full file path for the session JSONL file
57
+ */
58
+ export declare function generateSessionFilePath(sessionId: string, workdir: string, sessionType?: "main" | "subagent"): Promise<string>;
32
59
  /**
33
60
  * Generate session file path using project-based directory structure
34
- * Note: With metadata-based approach, we no longer need separate subagent directories
35
- * @param sessionId - UUIDv6 session identifier
61
+ * @param sessionId - UUID session identifier
36
62
  * @param workdir - Working directory for the session
63
+ * @param sessionType - Type of session ("main" or "subagent", defaults to "main")
37
64
  * @returns Promise resolving to full file path for the session JSONL file
38
65
  */
39
- export declare function getSessionFilePath(sessionId: string, workdir: string): Promise<string>;
66
+ export declare function getSessionFilePath(sessionId: string, workdir: string, sessionType?: "main" | "subagent"): Promise<string>;
40
67
  /**
41
- * Create a new session with metadata
42
- * @param sessionId - UUIDv6 session identifier
68
+ * Create a new session
69
+ * @param sessionId - UUID session identifier
43
70
  * @param workdir - Working directory for the session
44
- * @param sessionType - Type of session ('main' or 'subagent')
45
- * @param parentSessionId - Parent session ID for subagent sessions
46
- * @param subagentType - Type of subagent for subagent sessions
71
+ * @param sessionType - Type of session ("main" or "subagent", defaults to "main")
47
72
  */
48
- export declare function createSession(sessionId: string, workdir: string, sessionType?: "main" | "subagent", parentSessionId?: string, subagentType?: string): Promise<void>;
73
+ export declare function createSession(sessionId: string, workdir: string, sessionType?: "main" | "subagent"): Promise<void>;
49
74
  /**
50
75
  * Append messages to session using JSONL format (new approach)
51
76
  *
52
- * @param sessionId - UUIDv6 session identifier
77
+ * @param sessionId - UUID session identifier
53
78
  * @param newMessages - Array of messages to append
54
79
  * @param workdir - Working directory for the session
80
+ * @param sessionType - Type of session ("main" or "subagent", defaults to "main")
55
81
  */
56
- export declare function appendMessages(sessionId: string, newMessages: Message[], workdir: string): Promise<void>;
82
+ export declare function appendMessages(sessionId: string, newMessages: Message[], workdir: string, sessionType?: "main" | "subagent"): Promise<void>;
57
83
  /**
58
84
  * Load session data from JSONL file (new approach)
59
85
  *
60
- * @param sessionId - UUIDv6 session identifier
86
+ * @param sessionId - UUID session identifier
61
87
  * @param workdir - Working directory for the session
88
+ * @param sessionType - Type of session ("main" or "subagent", defaults to "main")
62
89
  * @returns Promise that resolves to session data or null if session doesn't exist
63
90
  */
64
- export declare function loadSessionFromJsonl(sessionId: string, workdir: string): Promise<SessionData | null>;
91
+ export declare function loadSessionFromJsonl(sessionId: string, workdir: string, sessionType?: "main" | "subagent"): Promise<SessionData | null>;
65
92
  /**
66
93
  * Get the most recently active session for a specific working directory (new JSONL approach)
67
94
  * Only returns main sessions, skips subagent sessions
68
- * Sessions are sorted by last active time (most recently active first)
95
+ * Uses listSessionsFromJsonl which already sorts sessions by last active time (most recent first)
69
96
  *
70
97
  * @param workdir - Working directory to find the most recently active session for
71
98
  * @returns Promise that resolves to the most recently active session data or null if no sessions exist
@@ -80,22 +107,19 @@ export declare function getLatestSessionFromJsonl(workdir: string): Promise<Sess
80
107
  */
81
108
  export declare function listSessions(workdir: string): Promise<SessionMetadata[]>;
82
109
  /**
83
- * List all sessions for a specific working directory using JSONL format (new approach)
110
+ * List all sessions for a specific working directory using JSONL format (optimized approach)
111
+ *
112
+ * PERFORMANCE OPTIMIZATION:
113
+ * - Uses filename parsing exclusively for session metadata
114
+ * - Only reads last message for timestamps and token counts
115
+ * - Eliminates O(n*2) file operations, achieving O(n) performance
116
+ * - Returns simplified session metadata objects
117
+ * - Only includes main sessions, excludes subagent sessions
84
118
  *
85
119
  * @param workdir - Working directory to filter sessions by
86
- * @param includeAllWorkdirs - If true, returns sessions from all working directories
87
- * @param includeSubagentSessions - If true, includes subagent sessions (default: false for user-facing operations)
88
120
  * @returns Promise that resolves to array of session metadata objects
89
121
  */
90
- export declare function listSessionsFromJsonl(workdir: string, includeAllWorkdirs?: boolean, includeSubagentSessions?: boolean): Promise<SessionMetadata[]>;
91
- /**
92
- * Delete a session from JSONL storage (new approach)
93
- *
94
- * @param sessionId - UUIDv6 session identifier
95
- * @param workdir - Working directory for the session
96
- * @returns Promise that resolves to true if session was deleted, false if it didn't exist
97
- */
98
- export declare function deleteSessionFromJsonl(sessionId: string, workdir: string): Promise<boolean>;
122
+ export declare function listSessionsFromJsonl(workdir: string): Promise<SessionMetadata[]>;
99
123
  /**
100
124
  * Clean up expired sessions older than 14 days based on file modification time
101
125
  *
@@ -110,9 +134,34 @@ export declare function cleanupEmptyProjectDirectories(): Promise<void>;
110
134
  /**
111
135
  * Check if a session exists in JSONL storage (new approach)
112
136
  *
113
- * @param sessionId - UUIDv6 session identifier
137
+ * @param sessionId - UUID session identifier
114
138
  * @param workdir - Working directory for the session
139
+ * @param sessionType - Type of session ("main" or "subagent"). If not provided, checks both types.
115
140
  * @returns Promise that resolves to true if session exists, false otherwise
116
141
  */
117
- export declare function sessionExistsInJsonl(sessionId: string, workdir: string): Promise<boolean>;
142
+ export declare function sessionExistsInJsonl(sessionId: string, workdir: string, sessionType?: "main" | "subagent"): Promise<boolean>;
143
+ /**
144
+ * Get the content of the first message in a session
145
+ * For user role: get text block content
146
+ * For assistant role: get compress block content
147
+ * @param sessionId - Session ID to get first message from
148
+ * @param workdir - Working directory for session operations
149
+ * @returns Promise that resolves to the first message content or null if not found
150
+ */
151
+ export declare function getFirstMessageContent(sessionId: string, workdir: string): Promise<string | null>;
152
+ /**
153
+ * Truncate content to a maximum length, adding ellipsis if truncated
154
+ * @param content - The content to truncate
155
+ * @param maxLength - Maximum length before truncation (default: 30)
156
+ * @returns Truncated content with ellipsis if needed
157
+ */
158
+ export declare function truncateContent(content: string, maxLength?: number): string;
159
+ /**
160
+ * Handle session restoration logic
161
+ * @param restoreSessionId - Specific session ID to restore
162
+ * @param continueLastSession - Whether to continue the most recent session
163
+ * @param workdir - Working directory for session restoration
164
+ * @returns Promise that resolves to session data or undefined
165
+ */
166
+ export declare function handleSessionRestoration(restoreSessionId?: string, continueLastSession?: boolean, workdir?: string): Promise<SessionData | undefined>;
118
167
  //# sourceMappingURL=session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/services/session.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAMjD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,GAAG,UAAU,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAGD,eAAO,MAAM,WAAW,QAAuC,CAAC;AAGhE;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMtD;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAAM,GAAG,UAAmB,EACzC,eAAe,CAAC,EAAE,MAAM,EACxB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,OAAO,EAAE,EACtB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAuD7B;AAED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAY7B;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,EAAE,CAAC,CAE5B;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,kBAAkB,UAAQ,EAC1B,uBAAuB,UAAQ,GAC9B,OAAO,CAAC,eAAe,EAAE,CAAC,CAuI5B;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CA2BlB;AAED;;;;;GAKG;AACH,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAsDjB;AAED;;GAEG;AACH,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,IAAI,CAAC,CA+BpE;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAQlB"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/services/session.ts"],"names":[],"mappings":"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"}